Java 多态

来源:互联网 发布:记账软件 共享 编辑:程序博客网 时间:2024/05/22 02:08

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);    }}
0 0
原创粉丝点击