快捷搜索: 王者荣耀 脱发

Java多态2 - 多态的细节

1. 多态的注意事项和细节讨论

多态的前提是: 两个对象(类)存在继承关系

多态的向上转型。

1. 本质: 父类的引用指向了子类的对象。

2.语法: 父类类型 引用名 = new 子类类型();

3. 特点:

3.1 编译类型看左边,运行类型看右边。

3.2 可以调用父类类型所有的成员 (需要遵循访问权限), 不能调用子类中特有成员。

3.2.1 能不能调用某方法是有程序运行的编译类型决定的,如果编译类型里没有该方法则不能调用

3.3 最终运行效果看子类的表现。即调用方法从运行类型(子类)开始查找方法。然后调用。

2. 新建对象类

新建Animal类

package org.example.poly_.details_;

public class Animal {
    String name = "动物";
    int age = 10;
    public void sleep(){
        System.out.println("睡觉");
    }
    public void run(){
        System.out.println("跑步");
    }
    public void eat(){
        System.out.println("吃饭");
    }
    public void show(){
        System.out.println("hello, 你好");
    }
}

新建Cat类

package org.example.poly_.details_;

public class Cat extends Animal{
    @Override
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void catchMouse(){//cat特有的方法,猫抓老鼠
        System.out.println("猫抓老鼠");
    }
}

3. 测试类

catchMouse方法不能调用,因为该方法在编译类型Animal里面没有。我们调用方法是看编译类型,如果编译类型里面有该方法才可以调用。

package org.example.poly_.details_;

public class PolyDetails {
    public static void main(String[] args) {
        //向上转型 : 父类的引用指向了子类的对象
        //语法 : 父类类型 引用名 = new 子类类型();
        Animal animal = new Cat();
        animal.eat();
        animal.run();
        animal.sleep();
        animal.show();
    }
}

4. 测试结果

猫吃鱼 跑步 睡觉 hello, 你好

在eat方法中是调用了Cat类的eat方法,这是为什么呢。

编译的时候是由编译类型javac决定的,但是运行的时候时是java执行子类的方法eat,所以调用了我们的子类eat方法。

经验分享 程序员 微信小程序 职场和发展