多态中的转型谷

Demo

package obj;

/**
 * 多态中的转型谷
 */
public class Dome {
    public static void main(String[] args) {
        /**
         * 实例化基类
         */
        //多态 - 向上转型
        Animal c = new Cat();
        System.out.println(c.name); // 动物
        //System.out.println(c.age); //报错,因为 Animal类中没有age属性
        c.skill(); //抓老鼠



        System.out.println("-------------------");

        //子类正常调用方式
        /*Cat c1 = new Cat();
        System.out.println(c1.name);//猫
        System.out.println(c1.age);//5 不报错,因为 Cat 类中有age属性
        c1.skill();//抓老鼠*/


        /**
         * 以上方法虽然能够调用到子类中的属性
         * 但是 是实例化的一个新的对象
         *
         * 通过转型(向下转型将实例化的 Animal对象的实例转换成子类 )
         * Cat a = (Cat)Cat();
         */
        //向下转型
        Cat a = (Cat) c;//将 Animal对象的实例转换成子类
        System.out.println(a.age);//5




    }
}

基类

package obj;

public class Animal {
    String name = "动物";

    public void skill()
    {
        System.out.println("警惕");
    }
}

子类

package obj;

public class Cat extends Animal{
    String name = "猫";
    byte age = 5;

    public void skill() {
        System.out.println("抓老鼠");
    }
}

添加新评论