您好,欢迎访问三七文档
Java面向对象编程-2本章内容•this关键字•static关键字•package和import语句•类的继承•访问控制•方法的重写•Object类•对象转型•多态•抽象类•接口this关键字•在类的方法定义中使用的this关键字代表使用该方法的对象的引用。•当必须指出当前使用方法的对象是谁时要使用this。•有时使用this可以处理方法中成员变量和参数重名的情况。publicclassLeaf{inti=0;publicLeaf(inti){this.i=i;}Leafincreament(){i++;returnthis;}voidprint(){System.out.println(i=+i);}publicstaticvoidmain(String[]args){Leafleaf=newLeaf(100);leaf.increament().increament().print();}}static关键字•静态成员变量在不创建类得对象的情况下,也可以使用,它是所有对象共有的变量,普通成员变量只有在创建了类的对象后才能被使用,与此相反,静态变量可以不先创建对象而直接使用。•静态变量的声明如下:staticinta;类.a=10;对象.a=20;publicclassTest{staticinta;intb;publicstaticvoidmain(String[]args){Test.a=10;Testt1=newTest();Testt2=newTest();System.out.println(t1.a);t1.a=20;System.out.println(t1.a);t2.a=30;System.out.println(Test.a);}}静态方法•只有在对象存在的条件下,我们才可以用成员变量和方法。然而,静态方法则不需要首先创建对象,可以直接调用它,在使用静态方法的时候一定要记住不可以在静态的方法中调用非静态的变量,如下程序:publicclassTest{inta;staticvoidsetA(intb){a=b;}publicstaticvoidmain(Stringargs[]){Test.setA(10);}}•静态变量与静态方法到底在什么方法中才能使用呢?如下程序publicclassTest{staticinta;staticvoidhello(){System.out.println(您好......);}staticvoidsetA(intb){a=b;hello();}voidprintA(){System.out.println(a);hello();}publicstaticvoidmain(Stringargs[]){Test.setA(100);Testt=newTest();t.printA();}}package和import语句•为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间。package和import语句•package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:–packagepkg1[.pkg2[.pkg3…]];•Java编译器把包对应于文件系统的目录管理,package语句中,用‘.’来指明包(目录)的层次,例如使用语句–packagecom.cstp;•则该文件中所有的类位于.com\cstp目录下•如果将一个类打包,则使用该类时,必须使用该类的全名(例如:com.cstp.MyClass),Java编译器才会在找到该类。•也可以使用import在文件的开头引入要使用到的类;例如:•可以不需要用import语句直接使用java.lang包中的类。importcom.cstp.MyClass;importjava.util.*;//引入java.util包中所有的类.........MyClassmyClass=newMyClass();//可以直接使用类名.........Packageimport总结•如果想将一个类放入包中,在这个类源文件第一句话写package•必须保证该类的class文件位于正确目录下•另外的类想访问的话:•写全名•引入–*–具体类名•访问位于同一个包中的类不需要引用类的继承与权限控制•Java中使用extends关键字实现类的继承机制•通过继承,子类自动拥有了基类(superclass)的所有成员(成员变量和方法)。•Java只支持单继承,不允许多继承:–一个子类只能有一个基类一个基类可以派生出多个子类–例子:TestExtends.java访问控制•Java权限修饰符publicprotectedprivate置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限。•对于class的权限修饰只可以用public和default。–public类可以在任意地方被访问–default类只可以被同一个包内部的类访问修饰符类内部同一个包子类任何地方privateYesdefault|packageYesYesprotectedYesYesYespublicYesYesYesYes方法的重写(OverWriteOverRide)•在子类中可以根据需要对从基类中继承来的方法进行重写。•重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。•重写方法不能使用比被重写方法更严格的访问权限。•例子:TestOverWrite.javasuper关键字•在Java类中使用super来引用基类的成分;例如:classFatherClass{publicintvalue;publicvoidf(){value=100;System.out.println(FatherClass.value=+value);}}classChildClassextendsFatherClass{publicintvalue;publicvoidf(){super.f();value=200;System.out.println(ChildClass.value=+value);System.out.println(value);System.out.println(super.value);}}继承中的构造方法•1、子类的构造过程中必须调用其基类的构造方法。•2、子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法。3.如果使用super,必须写在子类构造方法的第一行。4.如果子类的构造方法中没有显示地调用基类构造方法,则系统默认调用基类无参数的构造方法。如果子类的构造方法中没有显示地调用基类构造方法,而基类中又没有无参的构造方法,则编译出错。TestSuperSub.javaObject类•Object类是所有Java类的根基类•如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类publicclassPerson{...}•等价于:publicclassPersonextendsObject{...}对象转型•一个基类的引用类型变量可以“指向”其子类的对象。•一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。•可以使用引用变量instanceof类名来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。对象转型实例(1)classAnimal{publicStringname;Animal(Stringname){this.name=name;}}classCatextendsAnimal{publicStringeyeColor;Cat(Stringn,Stringc){super(n);eyeColor=c;}}ClassDogextendsAnimal{publicStringfurColor;Dog(Stringn,Stringc){super(n);furColor=c;}}对象转型实例(2)publicclassTest{publicstaticvoidmain(String[]args){Animala=newAnimal(name);Catc=newCat(catname,blue);Dogd=newDog(dogname,black);System.out.println(ainstanceofAnimal);//true;System.out.println(cinstanceofAnimal);//true;System.out.println(dinstanceofAnimal);//true;System.out.println(cinstanceofCat);//true;a=newDog(bigyellow,yellow);System.out.println(a.name);//bigyellowSystem.out.println(ainstanceofAnimal);//true;System.out.println(ainstanceofDog);//true;Dogd1=(Dog)a;//要加强制转换符System.out.println(d1.furColor);//yellow}}多态•多态源于希腊语,本意为“拥有多种形态”,在Java中,它指的是拥有相同形式,但根据不同的情形拥有不同机能的特性。•例子,“数字+数字=数字”,然而,“String对象+数字=String对象”,根据不同的情形,“+”运算符拥有不同的功能,既“+”运算符具有多态性。•还有实现了重载或重写的方法拥有相同的名字,但不同情形下,他们又拥有不同的功能,所以重载和重写也是一种多态。父类的引用指向子类对象从对象的内存角度来理解试试.假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.现在通过代码来看看内存的分配情况:Fatherf=newFather();//系统将分配1M内存.Sons=newSon();//系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用父类的方法.Sons1=s;//s1指向那1.5M的内存.Fatherf1=(Father)s;//这时f1会指向那1.5M内存中的1M内存,即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).Sons2=(Son)f;//这句代码运行时会报ClassCastException.因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.Sons3=(Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.抽象类•用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。•含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。如果重写不了,应该声明自己为抽象。•抽象类不能被实例化。•抽象方法只需声明,而不需实现。•例子:abstractclassAnimal{privateStringname;Animal(Stringname){this.name=name;}publicabstractvoidenjoy();}classCatextendsAnimal{privateStringeyesColor;Cat(Stringn,Stringc){super(n);eyesColor=c;}publicvoidenjoy(){System.out.println(猫叫声......);}}Fin
本文标题:面向对象特性-2
链接地址:https://www.777doc.com/doc-3968293 .html