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方法。
下一篇:
使用yml工具类获取yml属性