Java 多态

Java 多态

多态

  • 概念
    • 对象在不同时刻表现出来的不同状态
  • 多态的前提

    1. 要有继承或者实现关系

    2. 要有方法的重写

    3. 要有父类引用指向子类对象

  • 程序中的体现

    • 父类或者接口的引用指向或者接收自己的子类对象
  • 好处和作用

    • 多态的存在提高了程序的扩展性和后期的可维护性
  • 弊端

    • 父类调用的时候只能调用父类的方法,不能调用子类的特有方法,因为你并不清楚将来会有什么样子的子类继承你。
  • 多态的成员特点

    • 成员变量

      • 编译时期:看引用型变量所属的类中是否有所调用的变量;

      • 运行时期:也是看引用型变量所属的类中是否有调用的变量。

      • 简单记:编译和运行都看等号左边

    • 成员方法

      • 编译时期:看引用型变量所属的类中是否有所调用的成员;

      • 运行时期:看对象所属的类中是否有调用的成员,如果父类出现同名的方法,会运行子类中的方法,因为方法有覆盖的特性。

      • 简单记:编译看左边,运行看右边

    • 静态方法

      • 编译时期:看引用型变量所属的类中是否有所调用的变量;

      • 运行时期:也是看引用型变量所属的类中是否有调用的变量。

      • 简单记:编译和运行都看等号左边

向上转型和向下转型

  • 一定不能够将父类对象转换成子类类型

  • 父类引用指向子类对象,该引用可以被提升,也可以被强制转换。

  • 多态自始至终都是子类对象在变化

  • 示例

    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);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章