黑马程序员技术交流社区
标题: 多态 抽象类 接口 [打印本页]
作者: xyycici 时间: 2015-1-24 22:38
标题: 多态 抽象类 接口
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)。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |