Java 多态
多态
- 概念
- 对象在不同时刻表现出来的不同状态
多态的前提
要有继承或者实现关系
要有方法的重写
要有父类引用指向子类对象
程序中的体现
- 父类或者接口的引用指向或者接收自己的子类对象
好处和作用
- 多态的存在提高了程序的扩展性和后期的可维护性
弊端
- 父类调用的时候只能调用父类的方法,不能调用子类的特有方法,因为你并不清楚将来会有什么样子的子类继承你。
多态的成员特点
成员变量
编译时期:看引用型变量所属的类中是否有所调用的变量;
运行时期:也是看引用型变量所属的类中是否有调用的变量。
简单记:编译和运行都看等号左边
成员方法
编译时期:看引用型变量所属的类中是否有所调用的成员;
运行时期:看对象所属的类中是否有调用的成员,如果父类出现同名的方法,会运行子类中的方法,因为方法有覆盖的特性。
简单记:编译看左边,运行看右边
静态方法
编译时期:看引用型变量所属的类中是否有所调用的变量;
运行时期:也是看引用型变量所属的类中是否有调用的变量。
简单记:编译和运行都看等号左边
向上转型和向下转型
一定不能够将父类对象转换成子类类型
父类引用指向子类对象,该引用可以被提升,也可以被强制转换。
多态自始至终都是子类对象在变化
示例
class Demo1 { public static void main(String[] args) { // 向上转型,类型提升 Phone p1 = new Nokia(); // 向下转型,强制将父类的引用转换成子类类型,不能将Nokia类型转换成MOTO或Nexus类型 Nokia no = (Nokia)p1; // 输出 Phone---null---0 ;因为继承了父类的方法 no.print(); Phone p2 = new Moto(); Moto mo = (Moto)p2; // 输出 Moto---red---1500 ;因为重写了父类的方法 mo.print(); Phone p3 = new Nexus(); // 输出 Nexus---red---2000 p3.print(); } } class Phone { String color; int price; public void print() { System.out.println("Phone---" + color + "---" + price); } } class Nokia extends Phone { String color = "red"; int price = 1000; //public void print() { // System.out.println("Phone---" + color + "---" + price); //} } class Moto extends Phone { String color = "red"; int price = 1500; public void print() { System.out.println("Moto---" + color + "---" + price); } } class Nexus extends Phone { String color = "red"; int price = 2000; public void print() { System.out.println("Nexus---" + color + "---" + price); } }