《java教程-子类与继承.ppt》由会员分享,可在线阅读,更多相关《java教程-子类与继承.ppt(79页珍藏版)》请在三一办公上搜索。
1、5.子类与继承,主讲:王华彬,面向对象的特性,继承性,狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是“继承”关系的重要性质。,Animal,Lion,子类继承父类的非私有的基本属性和方法,同时又能创建属于自己的属性的方法。,创建子类,通过在类的声明中加入extends子句来创建一个类的子类:class SubClass extends SuperClass,Java技术及其应用,创建子类,class Animal动物基本属性和方法;属性:体重、高度、腿的数量;方法:进食、消化、排泄;class Lion extends Animal 自动拥有动物类中允许继承的属性和方法;还可
2、添加狮子特有的属性和方法;比如:毛发颜色、性别、凶猛程度;咆哮、捕猎、睡觉;,Java技术及其应用,我们先认识一下类的“祖先”,即所有类的根类;想象一下,什么是类的祖先?public class Aclass maintestpublic static void main(String args)A a;,默认继承类,类:所有类的祖先class A相当于class A extends 如果缺省extends子句,则该类为的子类。,Java技术及其应用,类,它处于Java开发环境的类层次树的根部,其他所有的类都直接或间接地为它的子类。该类定义了一些所有对象最基本的状态和行为,例如:equals(
3、)判断两个对象引用是否相同,等价于=getClass()返回一个对象在运行时所对应的类的表示,从而可以得到相应的信息。toString()返回对象的字符串表示。,Java技术及其应用,class T1 public class Test1 public static void main(String args)T1 t1=new T1();T1 t2=new T1();t2=t1;boolean b;b=t1.equals(t2);System.out.println(b);,接下来,分析一下多重继承和多层继承,面向对象特性继承性,Java中支持单继承。思考:为什么取消多重继承?,动物,水栖生
4、活动物,陆栖生活动物,水陆两栖动物,动物类,马类,驴类,骡子类,优点:继承二者优点,缺点?,为什么取消多重继承?,鱼类,鲫鱼类,家猪类,猪类,面向对象特性继承性,Java中不支持多重继承。Java中支持多层继承。再思考一下继承的作用?,1、提高代码复用度,减少代码;2、方便扩展,在以前的基础上进行改进3、总之,取其精华、引入创新,本章学习内容,1、子类继承父类的属性和方法2、父类的属性和方法不够用怎么办?研究:子类增加新的属性和方法3、父类如果想保留某些属性和方法怎么办?研究:父类设定某些属性和方法不允许继承 4、父类的某些属性和方法,不太适合子类怎么办?研究:子类修改父类的属性和方法 5、父
5、类不想被继承怎么办?研究:为了保密性,类可设置为不允许继承6、父类允许被继承,但是不想被修改属性和方法怎么办?父类的某些属性和方法允许继承,但是不允许子类修改;,子类的继承性,若子类和父类在同一个包内,子类可以继承父类中访问权限设定为public、protected、default的成员变量和方法。若子类和父类不在同一个包内,子类可以继承父类中访问权限设定为public、protected的成员变量和方法。,例题 正常继承,class Aint x;void setX(int x)this.x=x;int getX()return x;,Java技术及其应用,class B extends A
6、double y=12;void setY(int y)this.y=y+x;double getY()return y;,例题 私有继承,class Aprivate int x;void setX(int x)this.x=x;int getX()return x;,Java技术及其应用,class B extends Adouble y=12;void setY(int y)this.y=y+x;double getY()return y;,子类的继承性,Java技术及其应用,子类对象引用,class A private int x=10;protected double y=12.56
7、;void f()y=y+x;System.out.printf(x=%d,y=%fn,x,y);class B extends A double z=12;void g()z=y+100;System.out.printf(z=%fn,z);class Example public static void main(String args)B b=new B();b.f();/调用从父类继承的方法。B类本没有该方法 b.g();/调用子类自己声明的方法。,练习一,Java技术及其应用,class Aprivate int x;int y;protected int z;,class B ex
8、tends Avoid f()x=1;void g()y=1;void h()z=1;,指出程序中的错误?,练习二,Java技术及其应用,package p1;class Aprivate int x;int y;protected int z;,package p2;class B extends Avoid f()x=1;void g()y=1;void h()z=1;,public,import p1.A;,指出程序中的错误?,知识点小结,1、只有public类,才能被另一个包中的类继承;2、引入另一个包中的public类,需要用import3、private类型的属性或方法不能被继承4
9、、public类型的属性或方法一定可以被继承5、defalut 和 protected类型呢?,本章学习内容,1、子类继承父类的属性和方法2、父类的属性和方法不够用怎么办?研究:子类增加新的属性和方法3、父类如果想保留某些属性和方法怎么办?研究:父类设定某些属性和方法不允许继承 4、父类的某些属性和方法,不太适合子类怎么办?研究:子类修改父类的属性和方法 5、父类不想被继承怎么办?研究:为了保密性,类可设置为不允许继承6、父类允许被继承,但是不想被修改属性和方法怎么办?父类的某些属性和方法允许继承,但是不允许子类修改;,如何修改父类的方法?通过方法重写实现!思考:方法的重载是什么?和重写的区别
10、?,同名!,class Aint x;void setX(int x),Java技术及其应用,class B extends Aint x;/隐藏父类中的变量xvoid setX(int x)/重写父类中的方法setX(),重写的方法必须与父类中的方法名字相同、参数个数和类型相同,返回类型相同或是子类。,class Afloat computer(float x,float y)return x+y;public int g(int x,int y)return x+y;class B extends Afloat computer(float x,float y)return x*y;,Ja
11、va技术及其应用,B b=new B();puter(8,9);b.g(12,8);,class AA g()return new A();A f()return new A();class B extends AB f()return new B();,Java技术及其应用,B b=new B();b.f();b.g();,返回值是子类,思考1:下程序是否是重写?,class Afloat computer(float x,float y)return x+y;public int g(int x,int y)return x+y;class B extends Adouble comput
12、er(float x,float y)return x*y;,思考2:下程序是否是重写?,class A public int f(int x,int y)return x+y;class B extends A public int f(int x,int y,int z)return x*y;,思考3:重写时方法的权限管理,重写父类的方法时,不可以降低方法的访问权限class Aprotected float f(float x,float y)return x-y;class B extends Afloat f(float x,float y)return x+y;,Java技术及其应
13、用,public float f(float x,float y),知识点小结,方法重写与方法重载的区别方法重写:子类方法与父类方法同名,且参数个数类型一致,返回类型相同或子类。方法重载:方法名相同,参数个数或类型不同,返回类型相同,Java技术及其应用,如果在子类中定义一个和父类一样的属性,则父类的属性被隐藏;如果在子类中重写了父类的方法,则父类方法被隐藏;如果在子类中需要调用被隐藏的属性或方法,怎么办呢?思考:在类和对象章节中,成员变量被局部变量和参数变量隐藏时,怎么处理?,引用父类成员,Java中通过super来实现对父类成员的访问。1.访问父类被隐藏的成员变量,如:super.vari
14、able2.调用父类中被重写的方法,如:super.Method(paramlist);3.调用父类的构造函数,如:super(paramlist);,分析程序的问题?,class A double f(double x,double y)return x+y;class B extends A double f(double x,double y)double m=f(x,y);return m+x*y;class cpublic static void main(String args)B b=new B();System.out.println(b.f(10.0,8.0);,分析程序的问
15、题?,class A double f(double x,double y)return x+y;class B extends A double f(double x,double y)double m=super.f(x,y);return m+x*y;class cpublic static void main(String args)B b=new B();System.out.println(b.f(10.0,8.0);,既然子类继承了父类的部分属性和变量,在创建子类对象时,直接调用子类的构造函数。此时,并没有显式的调用父类的构造函数,而子类对象却能调用父类的属性和方法,思考为什么?
16、当创建一个子类对象时,总是先调用父类的构造方法,再调用子类的构造方法。,class Grandparent public Grandparent()System.out.println(GrandParent Created.);class Parent extends Grandparent public Parent()System.out.println(Parent Created);class Child extends Parent public Child()System.out.println(Child Created);,Java技术及其应用,Child c=new Chi
17、ld();,思考:父类有多个构造方法,子类创建对象时调用哪个呢?,class Grandparent public Grandparent()System.out.println(GrandParent Created.);public Grandparent(int i)System.out.println(GrandParent Created2.);class Child extends Grandparent public Child()System.out.println(Child Created);,Java技术及其应用,Child c=new Child();,思考:父类有多个
18、构造方法,默认调用的是没有参数的构造方法,如果想调用其他的构造方法怎么办呢?能否在子类的构造函数中,直接调用父类的构造函数呢?,class Grandparent public Grandparent()System.out.println(GrandParent Created.);public Grandparent(int i)System.out.println(GrandParent Created2.);class Child extends Grandparent public Child()Grandparent(1);System.out.println(Child Crea
19、ted);,Java技术及其应用,Child c=new Child();,思考:意味着什么?,可知:通常情况下,子类不继承父类的构造方法。怎样调用父类的构造方法呢?super()函数,class Grandparent public Grandparent()System.out.println(GrandParent Created.);public Grandparent(int i)System.out.println(GrandParent Created2.);class Child extends Grandparent public Child()super(1);System
20、.out.println(Child Created);,Java技术及其应用,Child c=new Child();,注意:Super()函数,必须在子类构造函数的第一行使用,class Grandparent public Grandparent()System.out.println(GrandParent Created.);public Grandparent(int i)System.out.println(GrandParent Created2.);class Child extends Grandparent public Child()System.out.println
21、(Child Created);super(1);,Java技术及其应用,Child c=new Child();,子类的构造方法小结,当创建一个子类对象时,总是先调用父类的构造方法,再调用子类的构造方法。如果子类的构造方法没有显示的调用父类的构造方法super(),则默认先调用父类的不带参数的那个构造方法。通常情况下,子类不继承父类的构造方法。,Java技术及其应用,Java多态性,静态多态性(编译)方法重载方法名相同,根据参数个数或类型不同,在编译阶段决定执行不同的方法。动态多态性(运行)方法重写方法名相同,参数相同,在运行阶段决定执行不同的方法。,动态多态性实现的前提条件,将子类的对象的
22、引用放到父类的对象中。例如:A类为父类,B类为子类。A a=new B();称a是new B()生成的对象的上转型对象。,a,new B(),class Avoid callme()System.out.println(A);class B extends Avoid callme()System.out.println(B);class C extends Avoid callme()System.out.println(C);,Java技术及其应用,A a=new A();a.callme();a=new B();a.callme();a=new C();a.callme();思考:a.c
23、allme 调用哪个?,重写方法的调用,a.callme();动态多态性A a;a=new B();a=new C();a.callme();对于重写的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。,class EspecialCarvoid cautionSound()class PoliceCar extends EspecialCarvoid cautionSound()System.out.println(111);class AmbulanceCar extends EspecialCarvoid cautionSound()System.out.prin
24、tln(222);,Java技术及其应用,EspecialCar car=new PoliceCar();car.cautionSound();car=new AmbulanceCar();car.cautionSound();,void f(),car.f();,小结,多态性方法重载方法重写子类对象引用赋值给父类对象,此父类对象称为上转型对象。上转型对象可以引用继承的变量和重写的方法,不可以引用子类新增的变量和方法。,Java技术及其应用,本章学习内容,1、子类继承父类的属性和方法2、父类的属性和方法不够用怎么办?研究:子类增加新的属性和方法3、父类如果想保留某些属性和方法怎么办?研究:父类
25、设定某些属性和方法不允许继承 4、父类的某些属性和方法,不太适合子类怎么办?研究:子类修改父类的属性和方法 5、父类不想被继承怎么办?研究:为了保密性,类可设置为不允许继承6、父类允许被继承,但是不想被修改属性和方法怎么办?父类的某些属性和方法允许继承,但是不允许子类修改;,final关键字,final 修饰变量,变量就变成了常量;final 修饰方法,方法就不能再重写;final 修饰类,类就不能再继承。例如:Java中的String类,对编译器和解释器的正常运行有很重要的作用,不能轻易改变它,因此把它修饰为final类,使他不能被继承,保证String类型的唯一性,final 修饰类,fi
26、nal class EspecialCarclass PoliceCar extends EspecialCar,final 修饰方法,方法就不能再重写,class EspecialCarfinal void cautionSound()System.out.println(111);class PoliceCar extends EspecialCarvoid cautionSound()System.out.println(222);,final 修饰变量,变量就变成了常量,class EspecialCarfinal int test;void cautionSound()System.
27、out.println(111);,小结,Final 关键字作用:final 修饰变量,变量就变成了常量;final 修饰方法,方法就不能再重写;final 修饰类,类就不能再继承。,小结,1、子类继承父类的属性和方法2、父类的属性和方法不够用怎么办?研究:子类增加新的属性和方法3、父类如果想保留某些属性和方法怎么办?研究:父类设定某些属性和方法不允许继承 4、父类的某些属性和方法,不太适合子类怎么办?研究:子类修改父类的属性和方法 5、父类不想被继承怎么办?研究:为了保密性,类可设置为不允许继承6、父类允许被继承,但是不想被修改属性和方法怎么办?父类的某些属性和方法允许继承,但是不允许子类修
28、改;,思考:在设计父类时,有些方法可能不容易定义,比如:银行类:包含一个方法:计算利息;由于各家银行计算利息的方法不同,因此,在设计银行类时,无法确定计算利息的方法;能否在设计银行类时,只声明该方法,不写实现,然后在设计银行子类时,根据具体银行,对父类的“计算利息”方法进行重写?,abstract类,abstract修饰类,抽象类;abstract class 类名成员变量;成员方法;(abstract方法或非abstract方法)抽象类必须被继承不能由抽象类声明对象;,Java技术及其应用,abstract方法,abstract修饰方法,抽象方法;abstract 成员方法();抽象方法只需
29、声明,无需实现。抽象方法必须被重写。,Java技术及其应用,抽象类(abstract class),抽象类中可以包含抽象方法,为所有子类定义一个统一的接口,但并不是必须的;一旦某个类中包含抽象方法,则这个类必须声明为抽象类,abstract class Aabstract void callme();void metoo()System.out.println(Inside As metoo()method);class B extends Avoid callme()System.out.println(Inside Bs callme()method);B a=new B();a.call
30、me();a.metoo();,面向抽象编程,abstract类只关心操作,不关心操作具体实现细节,可以使程序员把精力集中在程序的设计上,而不必拘泥于细节的实现。即:设计者只需设计好方法,而具体方法实现由子类的设计者实现。面向抽象编程:当设计一个类时,不让该类面向具体的类,而是面向抽象类。核心思想:将abstract类声明的对象作为其子类的上转型对象,利用它调用子类重写的方法。,Java技术及其应用,面向抽象编程举例,class Circle double radius;/圆的半径 double getArea()return 3.1415926*radius*radius;,Java技术及其
31、应用,面向抽象编程举例,class PillarCircle bottom;double height;public double getVolume()return bottom.getArea()*height;,Java技术及其应用,只能求圆柱体,面向抽象编程举例,class PillarGeometry bottom;double height;public double getVolume()return bottom.getArea()*height;abstract class Geometrypublic abstract double getArea();,Java技术及其应
32、用,面向抽象编程举例,class Circle extends Geometry double radius;/圆的半径 double getArea()return 3.1415926*radius*radius;class Rectangle extends Geometrydouble a,b;double getArea()return a*b;,Java技术及其应用,面向抽象编程举例,Pillar pillar;Geometry bottom;bottom=new Rectangle();pillar=new Pillar(bottom,58);bottom=new Circle()
33、;pillar=new Pillar(bottom,58);,Java技术及其应用,例题5-13,public abstract class Animal public abstract void cry();public abstract String getAnimalName();public class Simulator public void playSound(Animal animal)(现在播放+animal.getAnimalName()+类的声音:);animal.cry();,Java技术及其应用,例题5-13,public class Dog extends Anim
34、al public void cry()(汪汪.汪汪);public String getAnimalName()return 狗;,Java技术及其应用,例题5-13,public class Cat extends Animal public void cry()(喵喵.喵喵);public String getAnimalName()return 猫;,Java技术及其应用,例题5-13,public class Application public static void main(String args)Simulator simulator=new Simulator();simu
35、lator.playSound(new Dog();simulator.playSound(new Cat();,Java技术及其应用,例题5-13,public class Tiger extends Animal public void cry()(“吼.吼吼);public String getAnimalName()return“老虎;,Java技术及其应用,小结,当系统中增加新的模块时,不需要修改现有的模块。核心-闭扩展-开,Java技术及其应用,框架的核心部分,框架的扩展部分,Simulator,Animal,Dog,Cat,Tiger,再来一题,HardWork.java,Java技术及其应用,练习,设计一个抽象类People,具有抽象方法say();设计子类ChinaPeople,AmericaPeople,实现抽象方法say();设计一个Speak类,提供speaking()方法,以上转型对象作为参数,打印说话的内容。设计一个测试类Test,测试再增加一个子类AfricaPeople,实现抽象方法say();添加到测试类中。,Java技术及其应用,