1.多态: (1)概念:对象在不同时刻表现出来的不同状态。 (2)前提: @继承关系(类)或者实现关系(接口) @方法重写(非必要,只是不写多态没有意义) @父类(父接口)引用指向子类对象。 (3)对象及分类:针对引用类型。分为接口多态、类多态、抽象类多态。 (4)多态成员特点: eg . Fu f = new Zi ( ); @成员变量:编译看左边,运行看左边。[成员变量不存在复写概念,调用的总是父类的内容。] @成员方法:编译看左边;(看父类有没有此方法,编译时仅仅看父类。) 运行看右边。(运行时先看子类有无此方法,子类没有,再去看父类的方法。) 注意:父类的引用不能调用子类的特有方法,只可以调用父类的内容、子类复写的方法。 eg1. Fu f = new Zi1() ; f . show() ; //调用子类方法(子类复写的情况下) [变量没有复写概念] f.num; //调用父类成员变量。 [方法有复写概念] (5)多态弊端:父类引用不能使用子类特有功能。(向上转型(强转)) @基本类型:隐式转换(小到大),强制转换(大到小)。 @引用类型:向上转型(小到大),向下转型(大到小)。 eg.向上:Fu f = newZi ( ); //父类引用指向子类对象。 向下:Zi zi = (Zi) f ; //强制将父类类型转换成子类类型。 注:继承的弊端:强耦合性(父类添加了功能,子类被强制性添加了该方法。) (7)多态好处:可以提高代码的扩展性和可维护性。 @扩展性:多个类型的对象都可以调用。 @维护性:本来需要改100处,现在只需改1处。 注:形参可以是对象。 多态的好处:一个引用性变量可以不断接受多个对象,不断被赋值,而不需要一直创建变量。 eg. 多态代码。(Animal。Pig。Cat。Wolf。) /*多态 Animal 吃 Cat 吃鱼 Wolf 吃小白兔 Pig 吃饲料 */ 定义了一个工具类 class AnimalTool { public static void eat(Animala) //多态 { a.eat(); //这里的方法应该是父类必须有的,且子类都复写过的,这样a就会去调用子类相应复写的方法。 } //对于多态(父类引用指向子类对象),父类引用.方法()会先去寻找子类的方法. } 2.抽象类概述 (1)概念:抽取功能(方法声明)。 从很多对象中抽取方法声明,从而定义在一个新的类中。没有方法体的方法被称为抽象方法;有抽象方法的类被称为抽象类。 注意:抽象方法没有方法体。 eg.publicabstract void eat (); //无方法体。
(2)特点: @abstract修饰类和方法。(没有变量) @有抽象方法的类一定是抽象类(或者接口); 但抽象类中不一定有抽象方法。 @抽象类无法实例化。 ———实例化的方式:子类实现抽象方法,再创建子类对象。 @一个类是抽象类,继承它的子类要么是抽象类;要么重写所有抽象方法。 @有时候会选择父类是抽象类。 作用:强制要求子类必须完成某些功能。(因为子类必须复写所有抽象方法) (3)好处:提高代码的扩展性;(多态) 注意:继承好处:提高代码的复用性。 eg. abstract class Animal {……} class Dog extends Animal{……} //抽象类的多态 Animal a = new Dog( ) ; //即抽象类的实例化。(父类引用指向子类对象。) a.eat() ; (4)抽象类与接口的区别:(面试) @成员特点: a.抽象类的成员特点: A:成员变量 有成员变量,也有常量。 B:构造方法 有构造方法的。 用于子类访问父类数据前,对父类数据进行初始化(虽然不能被实例化)。 C:成员方法 抽象方法,为了要求子类做某些事情。(强制复写) 非抽象方法,是为了提高代码复用性,被子类继承。 b.接口成员特点: A.成员变量:只能是常量。默认修饰符:public static final (不可以被子类赋值) B.构造函数: 没有构造函数。(因为不需要对数据进行初始化,变量是静态的,以加载) 注:继承接口的子类调用的super()是object类的无参构造方法。 C.成员方法:只有抽象方法。默认修饰符:public abstract 关系:接口是一种抽象类的特殊情况。 强调:接口的方法都是抽象的。推荐永远加修饰符。 接口是不继承object类的。接口加载也生成class文件。 @设计理念的区别 抽象类(被继承):类中定义的是整个继承体系的共性内容。(is- a) 接口(被实现):接口中定义的是整个体系的扩展内容。(like- a) (5)关系特点 类与类:单继承;多层继承。 类与接口:单实现;多实现。(继承一个类的同时,实现多个接口) 接口与接口:单继承;多继承。 说明:接—接多继承的原因:即使父类接口同名,由于接口里的方法都是没有具体意义的,不会出现调用不明确的现象,子接口在具体实现时,复写即可(xy)。
|