当前位置 > it书童 > java > 正文

Java 对象的上下转型介绍

java it书童 2020-08-08 16:08:10 0赞 0踩 488阅读 0评论

对象的上下转型

在多态的代码当中,成员方法的访问规则是:看new的是谁,就优先用谁,没有则向上找。

口诀:编译看左边,运行看右边。

对比一下:

成员变量:编译看左边,运行还看左边。

成员方法:编译看左边,运行看右边

Father 类

public class Father {
    public void method() {
        System.out.println("父类方法");
    }
    public void methodFather() {
        System.out.println("父类特有的方法");
    }
}

Son 类

public class Son extends Father {
    @Override
    public void method() {
        System.out.println("子类方法");
    }
}

调用

public class Test {
    public static void main(String[] args) {
        Father obj = new Son();
        // 父子都有,优先用子
        obj.method(); // 子类方法

        // 子类没有,向上找父类
        obj.methodFather(); // 父类特有的方法
    }
}

向上转型与向下转型

Animal 类

public abstract class Animal {
    public abstract void eat();
}

Cat 类

public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}

Dog 类

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }
    public void watchHouse() {
        System.out.println("狗看家");
    }
}

向上转型一定是安全的,没有问题的,正确的。但是也有一个弊端:对象一旦向上转型为父类,那么就无法调用子类原本特有的内容。

解决方案:用对象的向下转型进行还原。

public class Test {
    public static void main(String[] args) {
        // 对象向上转型
        Animal animal = new Cat();
        animal.eat(); // 猫吃鱼
        // animal.catchMouse(); // 向上转型后无法调用子类的特有方法

        // 向下转型,进行还原
        Cat cat = (Cat) animal;
        cat.catchMouse(); // 猫抓老鼠

        // 错误的向下转型 将猫转成了狗
        // Dog dog = (Dog) animal;
        // dog.catchMouse();
    }
}

转型判断

向下转型时,需要先进行类型判断

public class Test {
    public static void main(String[] args) {
        giveMeAPet(new Dog()); // 狗看家
        giveMeAPet(new Cat()); // 猫抓老鼠
    }

    /**
     * 接收参数时进行了向上转型
     * 判断对象的类型
     * 进行向下转型
     * @param animal
     */
    public static void giveMeAPet(Animal animal) {
        if (animal instanceof Dog) {
            Dog dog = (Dog) animal;
            dog.watchHouse();
        }
        if (animal instanceof Cat) {
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
    }
}
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/560/introduction-to-the-transformation-of-java-objects