《子类与继承》PPT课件.ppt
《《子类与继承》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《子类与继承》PPT课件.ppt(76页珍藏版)》请在三一办公上搜索。
1、第5章子类与继承,主要内容 子类与父类 子类的继承性 子类对象的特点 成员变量的隐藏和方法重写 super关键字 final关键字 对象的上转型对象 继承与多态 abstract类与abstract方法 面向抽象编程 开-闭原则难点 成员变量的隐藏和方法重写 开-闭原则,导读,当我们准备编写一个类的时候,发现某个类已经有了我们所需要的成员变量和方法,假如我们想复用这个类中的成员变量和方法,即在所编写的类中不用声明成员变量就相当于有了这个成员变量,不用定义方法就相当于有了这个方法,那么我们可以将编写的类声明为这个类的子类。,5.1 子类与父类,在类的声明中,通过使用关键字extends来声明一个
2、类的子类,格式如下:class 子类名 extends 父类名,什么叫继承呢?所谓子类继承父类的成员变量作为自己的一个成员变量,就好像它们是在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作所谓子类继承父类的方法作为子类中的一个方法,就像它们是在子类中直接定义了一样,可以被子类中自己定义的任何实例方法调用。也就是说,如果子类中定义的实例方法不能操作父类的某个成员变量或方法,那么该成员变量或方法就没有被子类继承。子类不仅可以从父类继承成员变量和方法,而且根据需要还可以声明它自己的新成员变量、定义新的方法。,5.2 子类的继承性,访问限制修饰符不仅限制了对象对自己成员变量的操作和方法的调
3、用,也限制了继承性。当子类和父类在同一个包中时,父类中的private访问权限的成员变量不会被子类继承,也就是说,子类继承父类中的除private访问权限以外的其他成员变量作为子类的成员变量;同样,子类继承父类中的除private访问权限以外的其他方法作为子类的方法。,5.2.1 子类和父类在同一包中的继承性,例5-1,public class People double height=170,weight=67.9;protected void tellHeightAndWeight()(我的体重和身高:%2.2fkg,%2.2fcmn,weight,height);,public clas
4、s Student extends People int number;void tellNumber()(我的学号是:+number);int add(int x,int y)return x+y;int sub(int x,int y)return x-y;,public class UniverStudent extends Student int multi(int x,int y)return x*y;double div(double x,double y)return x/y;,public class Example5_1 public static void main(Str
5、ing args)int x=12,y=18;Student zhang=new Student();zhang.weight=73.8;zhang.height=177;zhang.number=100101;zhang.tellHeightAndWeight();zhang.tellNumber();System.out.print(zhang会做加减:);int result=zhang.add(x,y);System.out.printf(%d+%d=%dt,x,y,result);result=zhang.sub(x,y);System.out.printf(%d-%d=%dn,x,
6、y,result);UniverStudent geng=new UniverStudent();geng.number=6609;geng.tellHeightAndWeight();geng.tellNumber();System.out.print(geng会做加减乘除:);result=geng.add(x,y);System.out.printf(%d+%d=%dt,x,y,result);result=geng.sub(x,y);System.out.printf(%d-%d=%dt,x,y,result);result=geng.multi(x,y);System.out.pri
7、ntf(%d%d=%dt,x,y,result);double re=geng.div(x,y);System.out.printf(%d%d=%fn,x,y,re);,当子类和父类不在同一个包中时,父类中的private和友好访问权限的成员变量不会被子类继承,也就是说,子类只继承父类中的protected和public访问权限的成员变量作为子类的成员变量;同样,子类只继承父类中的protected和public访问权限的方法作为子类的方法。,5.2.2 子类和父类不在同一包中的继承性,现在需要对protected总结得更全面些:A-B,B-C,C-D如果用D类在D中创建了一个对象,那么该对象
8、总是可以通过“.”运算符访问继承的或自己定义的protected变量和protected方法的,但是,如果在另外一个类中,如在Other类中用D类创建了一个对象object,该对象通过“.”运算符访问protected变量和protected方法的权限如下列(1)、(2)所述。,5.2.3 protected的进一步说明,(1)对于子类D中声明的protected成员变量和方法,如果object要访问这些protected成员变量和方法,只要Other类和D类在同一个包中就可以了。(2)如果子类D的对象的protected成员变量或protected方法是从父类继承的,那么就要一直追溯到该pr
9、otected成员变量或方法的“祖先”类,即A类,如果Other类和A类在同一个包中,那么object对象能访问继承的protected变量和protected方法。,如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束。,5.2.4 继承关系(Generalization)的UML图,instanceof是双目运算符,其左面的操作元是对象,右面的操作元是类,当左面的操作元是右面的类或子类所创建的对象时,instanceof运算的结果是true,否则是
10、false。,5.2.5 关于instanceof运算符,当用子类的构造方法创建一个子类的对象时,不仅子类中声明的成员变量被分配了内存,而且父类的成员变量也都分配了内存空间,但只将其中一部分(子类继承的那部分)作为分配给子类对象的变量。也就是说,父类中的private成员变量尽管分配了内存空间,也不作为子类对象的变量,即子类不继承父类的私有成员变量。,5.3 子类对象的特点,同样,如果子类和父类不在同一包中,尽管父类的友好成员变量分配了内存空间,但也不作为子类的成员变量,即如果子类和父类不在同一包中,子类不继承父类的友好成员变量。,例5-2,public class A private int
11、 x;public void setX(int x)this.x=x;public int getX()return x;,public class B extends A double y=12;public void setY(int y)/this.y=y+x;非法,子类没有继承x public double getY()return y;,public class Example5_2 public static void main(String args)B b=new B();b.setX(888);(子类对象未继承的x的值是:+b.getX();b.y=12.678;(子类对象的
12、实例变量y的值是:+b.getY();,5.4.1 成员变量的隐藏子类对象以及子类自己声明定义的方法操作与父类同名的成员变量是指子类重新声明定义的这个成员变量。需要注意的是,子类对象仍然可以调用从父类继承的方法操作隐藏的成员变量。,5.4 成员变量的隐藏和方法重写,例5-3,public class Goods public double weight;public void oldSetWeight(double w)weight=w;System.out.println(double型的weight=+weight);public double oldGetPrice()double pr
13、ice=weight*10;return price;,public class CheapGoods extends Goods public int weight;public void newSetWeight(int w)weight=w;System.out.println(int型的weight=+weight);public double newGetPrice()double price=weight*10;return price;,public class Example5_3 public static void main(String args)CheapGoods c
14、heapGoods=new CheapGoods();cheapGoods.weight=198.98;cheapGoods.newSetWeight(198);(对象cheapGoods的weight的值是:+cheapGoods.weight);System.out.println(cheapGoods用子类新增的优惠方法计算价格:+cheapGoods.newGetPrice();cheapGoods.oldSetWeight(198.987);/子类对象调用继承的方法操作隐藏的double型变量weight System.out.println(cheapGoods使用继承的方法(无优
15、惠)计算价格:+cheapGoods.oldGetPrice();,1重写的语法规则方法重写是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型(所谓子类型是指:如果父类的方法的类型是“类”,那么允许子类的重写方法的类型是“子类”),并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。子类如此定义的方法称作子类重写的方法(不属于新增的方法)。,5.4.2 方法重写(Override),2重写的目的子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。如果父类的方法f可以被子类继承,子类就有权利重写
16、f,一旦子类重写了父类的方法f,就隐藏了继承的方法f,那么子类对象调用方法f调用的一定是重写方法f。重写方法既可以操作继承的成员变量、继承的方法,也可以操作子类新声明的成员变量、新定义的其他方法,但无法操作被子类隐藏的成员变量和方法。如果子类想使用被隐藏的方法或成员变量,必须使用关键字super,例5-4,public class University void enterRule(double math,double english,double chinese)double total=math+english+chinese;if(total=200)(考分+total+达到大学最低录取
17、线);else(考分+total+未达到大学最低录取线);,public class ImportantUniversity extends University void enterRule(double math,double english,double chinese)double total=math+english+chinese;if(total=245)(考分+total+达到重点大学最低录取线);else(考分+total+未达到重点大学最低录取线);,public class Example5_4 public static void main(String args)do
18、uble math=64,english=76.5,chinese=66;ImportantUniversity univer=new ImportantUniversity();univer.enterRule(math,english,chinese);/调用重写的方法 math=89;english=80;chinese=86;univer=new ImportantUniversity();univer.enterRule(math,english,chinese);/调用重写的方法,class A float computer(float x,float y)return x+y;p
19、ublic int g(int x,int y)return x+y;class B extends A float computer(float x,float y)return x*y;public class Example5_5 public static void main(String args)B b=new B();double result=puter(8,9);/b调用重写的方法(调用重写方法得到的结果:+result);int m=b.g(12,8);/b调用继承的方法(调用继承方法得到的结果:+m);,例5-5,在JDK 1.5版本之后,允许重写方法的类型可以是父类方法
20、的类型的子类型,即不必完全一致(JDK 1.5版本之前要求必须一致),也就是说,如果父类的方法的类型是“类”,重写方法的类型可以是“子类”。,3JDK 1.5对重写的改进,例5-6,public class HomeEletricity int weight;public void setWeight(int w)weight=w;public void showMess()(我是家用电器);,public class Television extends HomeEletricity public void showMess()(我是电视机,重量是+weight+kg);public cla
21、ss Icebox extends HomeEletricity public void showMess()(我是冰箱,重量是+weight+kg);,class Factory public HomeEletricity make()/方法的类型是HomeEletricity类 HomeEletricity machine=new HomeEletricity();return machine;class TVFactory extends Factory public Television make()/重写方法的类型是HomeEletricity类的子类:Television Tele
22、vision tv=new Television();tv.setWeight(21);return tv;class IceboxFactory extends Factory public Icebox make()/重写方法的类型是HomeEletricity类的子类:Icebox Icebox icebox=new Icebox();icebox.setWeight(67);return icebox;public class Example5_6 public static void main(String args)TVFactory factory1=new TVFactory(
23、);Television tv=factory1.make();/factory1调用重写的方法 tv.showMess();IceboxFactory factory2=new IceboxFactory();Icebox icebox=factory2.make();/factory2调用重写的方法 icebox.showMess();,重写父类的方法时,不可以降低方法的访问权限。下面的代码中,子类重写父类的方法f,该方法在父类中的访问权限是protected级别,子类重写时不允许级别低于protected,4重写的注意事项,class Aprotected float f(float x
24、,float y)return x-y;class B extends Afloat f(float x,float y)return x+y;,5.5.1 用super操作被隐藏的成员变量和方法子类一旦隐藏了继承的成员变量,那么子类创建的对象就不再拥有该变量,该变量将归关键字super所有,同样子类一旦隐藏了继承的方法,那么子类创建的对象就不能调用被隐藏的方法,该方法的调用由关键字super负责。因此,如果在子类中想使用被子类隐藏的成员变量或方法就需要使用关键字super。,5.5 super关键字,例5-7,public class Bank int savedMoney;int year
25、;double interest;public double computerInterest()interest=year*0.035*savedMoney;System.out.printf(%d元存在银行%d年的利息:%f元n,savedMoney,year,interest);return interest;,public class ConstructionBank extends Bank double year;public double computerInterest()super.year=(int)year;double remainNumber=year-(int)ye
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 子类与继承 子类 继承 PPT 课件

链接地址:https://www.31ppt.com/p-5632323.html