资源预览内容
第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
第9页 / 共19页
第10页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
继承、 多态,2018/9/13,继承、多态,2,面向对象的特性-继承,继承的概念 实现继承(超类和子类) 多态 动态绑定,2018/9/13,继承、多态,3,面向对象的特性-继承,通过继承实现代码复用。继承而得到的类称为子类,被继承的类称为父类。子类可以重写父类的方法,及命名与父类同名的成员变量。Java中所有的类都是通过直接或间接地继承 java.lang.Object类得到的。 Java不支持多重继承,即一个类从多个超类派生的能力。指 代的是类和类的关系,2018/9/13,继承、多态,4,继承关系,2018/9/13,继承、多态,5,超类(Car.java),运用继承,你能够创建一个通用超类,它定义了一系列相关项目的一般特性。 将各类汽车的公共属性和方法都纳入Car类中 公共属性:排气量、最高时速、当前时速等 公共方法:启动、加速等,2018/9/13,继承、多态,6,子类(Porsche2.java ),子类是超类的扩展版本,它继承了超类定义的所有实例变量和方法,并且为它自己增添了独特的元素,如: Porsche2扩展Car类,增加了Porsche2特定属性:涡轮 、 二氧化碳public class Porsche2 extends Car / add attributes private int turbos = 2; rivate boolean nos; ,2018/9/13,继承、多态,7,继承 当子类继承父类时,子类会把父类当中能继承过来的属性和方法都继承,对于父类中的构造函数,那么子类会用super(参数或不带参)来调用,调用的目的是用于把父类中属性变量初始化,进而在继承过来;如果不在子类的构造函数中写super(参数或不带参)调用父类的构造函数,那么默认都会通过super( );来调用父类中不带参的构造函数,如果这个时候父类当中不带参数的构造函数不存在那么报错如果在一个类中没有写构造函数,那么默认有一个不带参的构造函数,写了带参的构造函数系统就不会有默认的不带参数的构造函数!,2018/9/13,继承、多态,8,方法重写(Porsche2.java ),子类通过隐藏父类的成员变量和重写父类的方法,可以把父类的状态和行为改变为自身的状态和行为。 Porsche2重写了Car中的方法,其将会覆盖Car中相同签名方法,2018/9/13,继承、多态,9,方法重写原则, 方法重写时应遵循的原则: 1)改写后的方法不能比被重写的方法有更严格的访问权限(可以相同)。 2)改写后的方法不能比重写的方法产生更多的例外(异常)。,2018/9/13,继承、多态,10,super关键字,super与this类似,this变量引用类实例,super则引用超类实例,可以用super引用超类的方法和变量,super方法则引用超类的构造方法 子类通过super方法决定调用超类的那个构造方法public Porsche2() super( “Porsche“, 450, 220, 2, “Yellow“, 15, 5, Car.TIPTRONIC ); . ,2018/9/13,继承、多态,11,super关键字,如果子类构造方法中既未显式调用父类构造方法,而父类中又没有默认的构造方法,则编译出错。 super方法只能用于构造方法的第一条语句(思考:为什么?) super 与 this区别 super() /this() 构造函数 super.MethodName() this .MethodName() 调用方法 Super . PropertyName this. PropertyName 调用属性 This可以作为参数传入,super则不可以class A protected int i = 0; class B extends Apublic void Add(A a)for(int i = 0;i10;i+)a.i+;System.out.println(a.i); public void Add()Add(this); /this 作为一个对象传入,允许/Add(super); /不允许 public static void main(String argc)B b = new B();b.Add(); ,2018/9/13,继承、多态,12,面向对象的特性多态,子类的对象可以替代父类的对象使用 一个超类变量可以实际引用不同子类的对象Car myCar;myCar=new Porsche2(); (1)重载(overload)在同一个类中,如果自己写的两个或多个方法,方法名相同参数列表不同(与返回类型无关),那么这两个或多个方法发生了重载 (2)覆盖即重写(override)如果子类继承了父类把父类中方法继承过来,子类又添加了自己的方法,该方法和从父类继承过来的方法,方法名相同,返回类型相同,参数列表相同,访问修饰相同,异常声明相同(总称为方法声明相同),那么子类的方法覆盖(重写)了从父类继承到子类中方法,2018/9/13,继承、多态,13,多态,引用子类对象的超类变量不能再访问子类中添加的属性和方法Car myCar=new Porsche2();myCar. engageTurbos() ;/Error 但可以访问超类中声明被子类覆盖(重写)的方法!myCar. accelerate () ;/提问? myCar. accelerate()执行的哪个方法?为什么,2018/9/13,继承、多态,14,动态绑定,java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。 其中有这样的两个原则: 1、访问一个引用类型的变量的非静态方法,运行时与实际引用的对象的方法绑定; 2、访问一个引用类型的变量的成员变量,运行时与声明的类的成员变量绑定; (?) 其原因,对于成员变量,只有隐藏一说,并不能重载/改写,而对于方法,才有改写一说。 class A int v = 10; class B extends A int v = 100; public class Test public static void main(String args) A a = new A();B b = new B();A c = new B();System.out.println(“a.v = “ + a.v);System.out.println(“b.v = “ + b.v);System.out.println(“c.v = “ + c.v); 看这个例子,输出是 a.v = 10 b.v = 100 c.v = 10,2018/9/13,继承、多态,15,多态示例,public void drive( Car c )System.out.println( “Driving: “ + c );c.start();for( int i=0; i10; i+ )c.accelerate();System.out.println( “Current speed: “ + c.getCurrentSpeed() );for( int i=0; i5; i+ )c.decelerate();System.out.println( “Current speed: “ + c.getCurrentSpeed() );c.stop();,2018/9/13,继承、多态,16,多态示例(Driver2.java ),思考A:为什么Driver2.java中只用定义一个drive方法,就可以驾驶两种不同类型汽车,如果又有新车加入drive方法需要改变吗?,2018/9/13,继承、多态,17,方法重写与重载,重载方法-静态绑定同一个类中的多个同名方法,其参数列表必须不同,返回值不同或者相同。 重写方法-动态绑定子类重写父类中方法,其将会覆盖父类中相同签名方法。,2018/9/13,继承、多态,18,掌握重点,理解继承概念,为什么要使用继承 如何定义超类,子类 方法重载和重写 多态是如何实现的,2018/9/13,继承、多态,19,课后练习,设计一个上一章Employee类的子类Manager类,并覆盖getSalary方法(提示: Manager有职务奖金) 设计一个工具类Test,实现getSalary方法获得指定Employee对象的salary,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号