gpt4 book ai didi

java - 为什么父类(super class)对象不能在 Java 中隐式转换为子类对象?

转载 作者:搜寻专家 更新时间:2023-11-01 01:06:48 25 4
gpt4 key购买 nike

我有以下代码:

class A {
}

class B extends A {
public void fB(){};
}

根据Java规则:

案例一:

B b = new B();
A a = b;
((B)a).fB();

案例二:

A a = new A();
B b = a;

根据 Java 规则,Case 1 ok,case 2 not ok。为什么情况 2 不正常?这行 ((B)a).fB(); 实际上做了什么(我的意思是里面发生了什么)?

最佳答案

为什么情况 1 可以,而情况 2 不行:因为 DogAnimal,但不是每个 Animal 都是

class Animal { }
class Dog extends Animal { }
class Cat extends Animal { }

Dog fifi = new Dog();
Cat tommy = new Cat();

// OK because Dogs and Cats are Animals
Animal pet1 = fifi;
Animal pet2 = tommy;

// Not OK because an Animal is not always a Dog
Dog doggy = pet2;

请注意,转换对对象没有任何作用;特别是,它不会对对象进行任何类型的转换。转换只是告诉编译器“我这里有这个对象,我比你更清楚它是什么;我希望你把它当作类型 X,不要给我任何错误信息”。

所以在一行中是这样的:

Dog doggy = pet2;

编译器会提示,因为它不能确定 pet2 实际上是一只 Dog;它只知道它是一个 Animal - 而不是所有的 Animal 都是 Dog。你可以做一个转换来告诉编译器不要提示这个:

// Tell the compiler that you want it to treat pet2 as a Dog
Dog doggy = (Dog)pet2;

但是当你运行这个程序时,Java 仍然会检查 pet2 是否真的是一只 Dog,如果不是,你会得到一个 ClassCastException.

(正如 biziclop 所注意到的,您标题中的问题与您的意思完全相反)。

关于java - 为什么父类(super class)对象不能在 Java 中隐式转换为子类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9770872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com