继承和抽象类_第1页
继承和抽象类_第2页
继承和抽象类_第3页
继承和抽象类_第4页
继承和抽象类_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5 计算平面图形的面积类的继承学习目标掌握继承及继承规则掌握使用方法重写实现动态多态了解构造方法的调用顺序this与super掌握对象转型和使用instanceof操作符抽象方法与抽象类最终方法与最终类接口1计算平面图形的面积任务一 定义超类和子类 任务二 在超类和子类中定义构造方法任务三 把超类定义成抽象类任务四 接口2类的继承3任务1 定义超类和子类继承作用实现代码的重用(库和自己义)。继承类复用这个类的成员变量和方法再在新类中添加新的属性和方法, 或改写父类的方法。继承是类之间的一种关系:一般和特殊的关系 如:猫是动物,其实猫从动物继承。4父类和子类 子类(派生类):继承一个类产生的新类

2、。 父类(超类):被继承的类。 Java中所有的类都有超类。除了Object外如果类的定义中没有指定超类,默认的超类是java.lang包中的Object 5类的继承创建类时通过extends指明是已有类的子类 修饰符 class 子类名 extends 父类名 /类体,定义子类自己的成员变量和成员方法 其中父类来自系统类库用户自定义类其中超类必须存在;缺省继承自Object6类的继承规则子类继承除 private 外所有父类成员变量方法Java不支持多重继承。每个子类只能有一个超类 多重继承思想可用接口实现继承实现将共有属性和行为定义为超类中的成员变量和成员方法子类除了继承这些成员变量和成员

3、方法,还可以定义特有的属性和行为7类层次结构Java.lang.Object是所有类的根类8类的继承子类是作为另一个类的扩充或修正而定义的一个类。9例题Person类 属性name; getters和setters方法Student类继承Person类 属性num; getters和setters方法show()方法10访问修饰符的控制范围:可访问:可继承11继承规则父类和子类在同一个包父类中private修饰的成员不能被子类继承。父类中缺省、protected和public修饰的成员都被子类继承父类和子类在不同一个包 父类中private和缺省修饰的成员不能被子类继承父类中proteded和

4、public修饰的成员都被子类继承。子类继承父类时同样要求能够找到超类,因此父类必须有package语句,子类必须有import语句,父类还必须有public修饰符Parent类和对象讲过12类的继承继承规则图示包2子类2Public SuperClass子类1Public int b;Protected int c;int a;public int b;protected int c;private int d;int a;public int b;protected int c;包1被继承到被继承到nono被继承到被继承到被继承到noimport131、把student类和person类放

5、在同一个包中2、把student类和person类放在不同的包中对成员方法设置不同的权限14在超类和子类中定义构造方法超类中没有构造方法,子类也没有,怎么办?超类中没有构造方法,子类有,怎么办?超类中有构造方法?子类也有,怎么办?超类有构造方法,子类没有,怎么办?子类有超类,超类又有超类,又怎么办?15在超类和子类中定义构造方法超类中没有构造方法时,子类的构造方法可以初始化从超类继承的成员变量当超类和子类都定义了构造方法时,超类的构造方法初始化超类定义的成员变量,子类的构造方法初始化子类定义的成员变量。创建子类对象时,执行父类和子类的构造方法。必须在子类中使用关键字super调用父类的构造方法

6、。16this和super系统默认,每个类有null、this和super三个域,直接使用this 引用自身对象super 引用父类对象this的主要作用是将自身对象当作参数,传给别的对象的成员方法super用来引用父类中的(被覆盖的)方法、(被隐藏的)变量及构造方法。this和super可以调用当前对象或父类对象的构造函数17构造方法的继承 原则子类没有定义构造方法使用默认构造方法,无条件自动继承父类无参构造方法,并在创建新子类对象时自动执行。子类定义自己的构造方法若子类的构造方法中没有super()语句,创建对象时系统将先自动调用继承自父类的无参构造方法,再执行自己的构造函数。子类的构造方

7、法定义中,如要调用父类的含参数的构造方法,需用super关键字,且该调用语句必须是子类构造方法的第一个可执行语句。构造方法可利用this调用本类其他的构造方法,此时this应是第一个可执行语句。18public class A extends F5 private F1 f1 = new F1();private F2 f2 = new F2();A() System.out.println(A);public static void main(String args) A a = new A();class F1 F1() System.out.println(F1);class F2 F2

8、() System.out.println(F2);class F3 F3() System.out.println(F3);class F4 extends F3 F4() System.out.println(F4);class F5 extends F4 F5() System.out.println(F5);构造方法的调用顺序-面试和资格考试重点 F3F4F5F1F2A有父类的话先调用父类的构造方法,如果父类之上还有父类,则继续向上调用,直到最顶层父类为止,再一层一层向下调用其它父类的构造方法;当调用完最靠近子类的父类的构造方法时,执行本子类成员对象的构造方法;执行子类的构造方法。19

9、课堂练习思考class Meal Meal()System.out.println(Meal); class Bread Bread() class Cheese Cheese() class Lettuce Lettuce() class Lunch extends Meal Lunch() class PortableLunch extends Lunch PortableLunch() class Sandwich extends PortableLunch Bread b = new Bread(); Cheese c = new Cheese(); Lettuce l = new L

10、ettuce(); Sandwich() . public static void main(String args) new Sandwich(); Meal( ) Lunch( ) PortableLunch( ) Bread( ) Cheese( ) Lettuce( ) Sandwich( )20构造方法的继承规则class SuperClassprivate int n;SuperClass()System.out.println(SuperClass();SuperClass(int n)System.out.println(SuperClass(+n+);this.n=n;cla

11、ss SubClass extends SuperClassprivate int n;SubClass()super(100);System.out.println(SubClass();SubClass(int n)System.out.println(SubClass(+n+);this.n=n;public static void main(String args)SubClass sc1=new SubClass();SubClass sc2=new SubClass(200);215.2.4 知识拓展int i;Long j;j=i;i=(int)j;类的引用变量之间的相互赋值?2

12、2对象转型父类变量引用子类对象(向上转型) Student stunew Student(); Person pnew Student();/父类引用新创建的子类对象 Person p1stu;/ 父类的引用变量引用子类对象子类对象可以作为父类对象使用因为子类通过继承具备了父类的所有属性(私有的除外)。程序中凡是用到父类对象的地方,都可以用子类对象代替。父类对象赋给子类变量(向下转型) Student s(Student)p1; 必须使用强制类型转换,必须确保该父类变量目前引用的是子类对象。23对象转型规则父类引用子类对象父类的引用不可以访问其子类对象新增加的成员(成员变量和方法,失掉了这部分

13、的属性和操作)。可以访问子类继承或隐藏的成员变量,也可以使用子类继承或重写的方法(如果子类有隐藏或重写,则访问的是子类的)。子类引用父类对象使用强制类型转换,且必须确保该父类变量当前引用的是子类对象,否则抛出异常。若A是B的父类A a=new A();B b=new B();a=b; /a不能访问子类b的自己的成员变量或方法, /只能访问父类中的成员b=(A)a;/父类对象a当前必须是引用的子类B的对象猫是动物,狗也是动物.但是动物不一定是猫(狗).只有原来是猫(狗)的动物才能被转成猫(狗).24instanceof运算符应用eg1:String s = “I AM an Object! ”;

14、 boolean isObject = s instanceof Object; 结果为true eg2:一个处理网上购书系统,其中有这样三个类: public double calculate(Book book) if (book instanceof ComputerBook) /处理计算机类书的打折 if (book instanceof Novel) /处理小说类书的打折 . public class Book /省略细节 public class ComputerBook extends Book /省略细节 public class Novel extends Book /省略细

15、节 在处理程序里有一个方法,接受一个Book类型的对象,计算打折金额。假设两种打折方法不同,而传入的Book对象可能是两种中的任何一种,所以要用instanceof来判断可以用一个方法处理两种子类。UseOfInstanceof25变量隐藏和方法重写子类对父类可做扩展和特殊化创建新的成员:变量和方法重新定义父类中已有的变量:变量隐藏重新定义父类中已有的方法:方法重写(覆盖)(overwrite 或override) 26变量隐藏子类重新定义从父类继承的完全相同的变量称为变量隐藏。变量隐藏后变量的处理当子类执行继承自父类的操作时,处理的是父类的变量当子类执行自己定义的方法时,操作的是自己的变量,

16、把父类的变量“隐藏”起来class Employee String name; String department; public void showName() System.out.println(name); class Manager extends Employee String department; public void showInfo() showName(); System.out.println(Manager:+department); 27方法的重写(覆盖)重写是子类根据需要重新定义继承自父类的方法,使子类具有自己的行为。子类中的重写的方法应与父类中的被覆盖的方法有

17、完全相同的:方法名称、参数列表、返回值类型。重写时,修改方法的修饰权限只能从小到大 private defaultprotectedpublicclass Employee String name; public void showInfo() System.out.println(name); class Manager extends Employee String department; public void showInfo() System.out.println(name); System.out.println(“Manager of ” + department); 28示例

18、:隐藏和覆盖class MyClassprotected String s=a member of MyClass;protected void test()System.out.println(s);public class MySubClass extends MyClasspublic String s=“a member of MySubClass”;/隐藏public void test()/重写super.test();/执行父类操作时执行的是父类的变量System.out.println(s); /此时的s是子类的变量public static void main(String

19、args)MySubClass msc=new MySubClass();System.out.println(msc.s);msc.test(); a member of MySubClassa member of MyClassa member of MySubClass29示例:成员隐藏-方法覆盖class Aint x=1234;void show()System.out.println(class A:);class B extends Adouble x=567.89;void show()super.show();System.out.println(calss B:);clas

20、s C extends Bchar x=c;void showABC()System.out.println(super.x);System.out.println(x);super.show();show(); void show()System.out.println(class C:);class OverTestpublic static void main(String args)C cc=new C();cc.showABC();567.89cclass A:calss B:class C:成员隐藏,对变量名相同重新定义,类型可以不同方法覆盖:方法名称、参数列表、返回值类型必须相同

21、30多态性编译时多态 通过方法重载实现。 编译时通过参数列表(个数不同、对应参数类型不同)选择匹配的方法定义。运行时多态 通过重写来实现。对于重写的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。对子类的实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承父类的方法(未重写),则运行时系统调用父类的方法。一个父类对象可以通过子类实例调用子类的方法。 31运行时多态class Aint i,j; A(int i,int j) this.i=i; this.j=j; int add() return i+j; class B extends A B(i

22、nt i,int j) super(i,j); int multiply() return 0;class C extends B C(int i,int j) super(i,j); int muliply() return i*j;class Inheritance public static void main(String args) B x=new C(6,8); System.out.println(“i*j=”+x.mulitply(); /通过x调用子类C重重写的mulitply方法 System.out.println(“i*j=”+x.add(); /调用父类add方法,该

23、方法未被子类重写 i*j=48i+j=1432多态总结方法的重写与重载的区别重载:一个类中,同名方法(参数不同)重写:子类对父类方法的重写(不同类的同名方法)重写与隐藏的区别:子类隐藏父类的变量只是使之不可见,父类的同名变量在子类对象中仍然占有自己独立的内存空间;而子类方法对父类同名方法的重写将清除父类方法占用的内存,从而使父类方法在子类对象中不复存在。33Object类所有类的父类主要的方法:getClass()方法toString()方法equals()方法34抽象方法和抽象类抽象类 abstract修饰抽象类必须被继承。抽象类不能被直接实例化(new 创建对象),抽象类对象可以引用其子类实例对象。只能作为其它类的父类抽象方法 abstract修饰抽象方法必须被重写抽象方法只有声明,不能有实现。定义了抽象方法的类必须是抽象类重要定义抽象类的目的:用它作为基类去创建派生类. 抽象类的作用是作为一个类族中的共同基类图书类定义为抽象类UseAbstract35 抽象类和方法 注意: 抽象类与具体类一般与特殊继承与被继承抽象类不能创建对象若要定义对象,可以引用其具体子类对象。抽象类中可以定义零个或多个抽象的方法(必须用abstract修饰),但定义的方法都必须在其子类中具体实现,抽象类中也可以定义具体的方法。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论