Java基础之多态和抽象类
多态(重中之重、难点)
-
基本概念
多态主要指同一种事物表现出来的多种形态。
-
语法格式
父类类型 引用变量名 = new 子类类型();
1 | Person pw = new Worker(); |
-
多态的效果
(1)当父类类型的引用指向子类对象时,父类类型的引用可以直接调用父类中独有的方法.
(2)当父类类型的引用指向子类对象时,父类类型的引用不可以直接调用子类独有的方法.
(3)对于父子类都拥有的非静态成员方法来说,编译阶段调用父类版本,运行阶段调用子类版本.
(4)对于父子类都拥有的静态成员方法来说,编译阶段和运行阶段都调用父类版本.
-
引用数据类型之间的转换
(1)引用数据类型之间的转换分为:自动类型转换 和 强制类型转换。
其中自动类型转换主要指从小类型到大类型的转换,也就是从子类到父类的转换。
其中强制类型转换主要指从大类型到小类型的转换,也就是从父类到子类的转换。
(2)引用数据类型之间的转换必须发生在父子类之间,否则编译报错。
(3)若目标类型不是引用变量指向的对象类型,则编译通过运行发生类型转换异常。
(4)为了避免上述错误的发生则应该进行判断,具体方式如下:
if(引用变量名 instanceof 目标类型) - 用于判断引用指向的对象是否为目标类型
-
实际意义
多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的结果。
1 | public class Person { |
1 | public class Worker extends Person { |
1 | public class Teacher extends Person { |
1 | public class PersonWorkerTest { |
抽象类(重点)
-
抽象方法的概念
抽象方法主要指不能具体实现的方法并且使用abstract关键字修饰,格式如下:
访问权限 abstract 返回值类型 成员方法名(形参列表);
如:public abstract void cry();
-
抽象类的概念
抽象类主要指不能具体实例化的类并且使用abstract关键字修饰。
-
注意事项
(1)抽象类中可以有成员变量、成员方法以及构造方法。
(2)抽象类中可以没有抽象方法,也可以有抽象方法。
(3)拥有抽象方法的类必须是抽象类,因此真正意义上的抽象类是由abstract关键字修饰并且拥有抽象方法的类。
-
实际意义
抽象类的实际意义不在于自身创建对象而在于被继承,当一个类继承抽象类之后必须重写抽象方法,否则该类也变成抽象类。
因此抽象类对子类具有强制性和规范性,叫做模板设计模式。
-
经验分享
在以后的开发中推荐使用多态的方式编写代码,此时抽象类的引用可以直接调用的所有方法一定是抽象类中拥有的方法,当需要更换子类时只需要将new后面的类型修改而其它地方代码不变就立即生效,从而提高了代码的可维护性。
该方式的缺点在于:父类引用若希望访问子类独有方法,则需要强制类型转换。
1 | public abstract class AbstractTest { |
1 | public /* abstract */ class SubAbstractTest extends AbstractTest { |