资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,5,章 多态与继承,在,Java,中,类是一个层次结构,其中有一个被称为,Object,的特殊超类,所有的类都直接或间接地继承,Object,类,子类,继承,父类的属性和方法,同时也可以,修改,父类的属性或,重载,父类的方法,以及在父类的基础上,添加,新的属性和方法。因此,父类和子类 之间反映的是“,一般与特殊,”的关系,子类的定义格式,修饰符,子类名,extends,父类名,类体;,注意,没有,extends,,,默认父类为,Object,只能有一个父类,即单继承,子类继承父类的全部成员,类继承具有传递性,例,1:ClassInheritance.java,class B,int,b1=1;,public,int,b2=2;,protected,int,b3=3;,private,int,b4=4;,int,getb4()return b4;,class A extends B,int,a=5;,int,Sum()return b1+b2+b3+getb4()+a;,class,ClassInheritance,static public void main(String,arg,),B bb=new B();,System.out.println(B,:+bb.b1+bb.b2+,+bb.b3+bb.getb4();,A,aa,=new A();,System.out.println(A,:+aa.b1+aa.b2+,+aa.b3+aa.getb4()+,aa.a,+,aa.Sum,();,class B,int,b1=1;,public,int,b2=2;,protected,int,b3=3;,private,int,b4=4;,int,getb4()return b4;,void setb4(,int,i)b4=i;,class A extends B,int,a=5;,class C extends A,int,c=6;,void change(,int,increase),b1+=increase;,b2+=increase;,b3+=increase;,setb4(getb4()+increase);,a+=increase;,c+=increase;,例,2:CPP.java,class CPP,static public void main(String,arg,),C cc=new C();,System.out.println(C,:+cc.b1+cc.b2+,cc.b3+cc.getb4()+cc.a+cc.c);,cc.change(15);,System.out.println(C,:+cc.b1+cc.b2+,cc.b3+cc.getb4()+cc.a+cc.c);,例,3,类继承的访问权限,nheritance.java,import,java.io,.*;,class A,int,a1=2;,public,int,a2=4;,private,int,a3=6;,protected,int,a4=8;,void access(),System.out.println(“Calss,A:”);,System.out.println(“friendly,element=”+a1);,System.out.println(“pubilc,element=”+a2);,System.out.println(“private,element=”+a3);,System.out.println(“protected,element=”+a4);,int,geta3(),return a3;,class B extends A,void access(),System.out.println(“Calss,B:”);,System.out.println(“friendly,element=”+a1);,System.out.println(“pubilc,element=”+a2);,System.out.println(“protected,element=”+a4);,A p=new A();,System.out.println(“Calss,A-Class B:”);,System.out.println(“friendly,element=”+p.a1);,System.out.println(“pubilc,element=”+p.a2);,System.out.println(“protected,element=”+p.a4);,public class inheritance,public static void,main(String,arg,),A,p=new A();,p.access,();,System.out.println,(“private,element=”+,p.geta3,();,B,q=new B();,q.access,();,System.out.println,(“private,element=”+,q.geta3,();,例,4,类继承的传递性,example.java,import,java.io,.*;,class A,int,a1=2;,public,int,a2=4;,private,int,a3=6;,protected,int,a4=8;,int,geta3(),return a3;,class B extends A,int,b=10;,class C extends B,int,c=12;,void add(),a1+;a2+;a4+;b+;c+;,class example,public static void main(String,arg,),C s=new C();,System.out.println(s.a1+“”+s.a2+“”,+s.geta3()+“”+s.a4+“”+s.b+“”+s.c);,s.add();,System.out.println(s.a1+“”+s.a2+“”+s.geta3()+“”+s.a4+“”+s.b+“”+s.c);,子类与父类的属性与方法,子类继承父类的所有内容,但父类中的,private,部分不能直接访问,子类中新增加的属性和方法是对父类的扩展,子类中定义的与父类同名的属性是对父类属性的隐藏,同名的方法是对父类方法的重载或覆盖,4,。,this,与,super,(,1,),this,代表当前对象本身,准确地说,代表了对象本身地一个引用,即对象地另一个名字。,一般,this,用来把当前对象的引用作为参数传递给其他的对象或方法。,import,java.,awt,.event.*;,public class,getDuoble,extends,Applet,implements,ActionListener,Label prompt;,TextField,input;,double,d=0.0;,public,void,init(),prompt=,new,Label(“,请输入一个浮点数,:);,input=,new,TextField,(10);,add(prompt);,add(input);,input.,addActionListener,(,this,);,public void,paint(Graphics g),g.,drawString,(,你输入了数据:,+,d,10,50);,public void,actionPerformed,(,ActionEvent,g),d=Double.,valueOf,(input.,getText,().,doubleValue,();,repaint();,这里,this,就是将当前,getDuoble,类的,对象指定为调用,addActionListener,(),方法的实际参数。,(,2,),super,代表当前对象直接父类对象,是当前对象直接父类对象的一个引用。,如在,class,D200_Card,extends,Number_,PhoneCard,中定义:,double,getBalance,(),return,super.balance;,其返回值为,0.0,。因为,balance,不是,Number_,PhoneCard,定义的域,而是从,PhoneCard,中继承的域。,(,3,)父类对象和子类对象的转换,子类对象转换为父类对象时,可以用显式或隐式实现,即子类对象可以直接向父类对象赋值;,父类对象向子类对象赋值时,必须使用显式转换,即强制类型转换。,class A,String s=class:A;,class B extends A,String s=class:B;,class,TypeV,static public void main(String,arg,),B b1,b2=new B();,A a1,a2;,a1=(A)b2;,a2=b2;,System.out.println(a1.s);,System.out.println(a2.s);,b1=(B)a1;,System.out.println(b1.s);,隐藏成员变量和方法重载,:,子类除了可以增加属于自己的、父类中没有的成员变量和方法,还可以重新定义父类中的成员变量和方法。,方法重载,:,参数表必须不同,即参数个数不同或者参数类型不同,使得系统能够正确调用所需执行的方法。返回类型则没有严格的要求,可以不同也可以相同。,覆盖,:,是指子类中新增加的成员变量或者方法与父类中的成员变量或方法同名,但是功能不同。,方法重载和方法覆盖不同,:,方法重载,是表示父类和子类或者同一类中有多个相同名字的方法,但是参数表不同;,方法覆盖,则表示父类和子类中具有相同名字,相同参数表的方法,。,5.5,构造函数的继承和重载,1.,构造函数的重载,D200_Card(),D200_Card(,long,cn,),cardNumber,=,cn,;,D200_Card(,long,cn,int,pw,),cardNumber,=,cn,;,password=,pw,;,D200_Card(,long,cn,int,pw,double,b),cardNumber,=,cn,;,password=,pw,;,balance=b;,D200_Card(,long,cn,int,pw,double,b,String c),cardNumber,=,cn,;,password=,pw,;,balance=b;,connectNumber,=c;,构造函数可相互调用,如:,D200_Card(,long,cn,int,pw,double,b,String c),this,(,cn,pw,b),connectNumber,=c;,2.,构造函数的继承,规则:,(,1,)无条件继承父类不含参数的构造函数。,(,2,)如果子类自己定义了构造函数,创建新对象时,它将先执行继承父类的无参数构造函数,然后再执行自己的构造函数。,(,3,)对于父类含参数构造函数,子类可以通过再自己的构,造函数中使用,super,关键字调用它,但这个调用语句必须是子类构造函数的第一个可执行语句。,Number_,PhoneCard,(),Number_,PhoneCard,(,long,cn,),cardNumber,=,cn,;,Number_,PhoneCard,(,long,cn,int,pw,),cardNumber,=,cn,;,password=,pw,;,Number_,PhoneCard,(,long,cn,int,pw,double,b),cardNumber,=,cn,;,password=,pw,;,balance=b;,Number_,PhoneCard,(,long,cn,int,p
展开阅读全文