请考虑以下代码段
public class SuperClass {
public void move()
{
System.out.println("i am in super class");
}
}
public class SubClass1 extends SuperClass{
public void move()
{
System.out.println("i am in sub1 class");
}
}
public class SubClass2 extends SuperClass {
public void move()
{
System.out.println("i am in sub2 class");
}
}
现在我正在创建这样的对象。
public class program {
public static void main(String[] args) {
SubClass1 obj = new SubClass2(); // Compile error - Type mismatch: cannot convert from SubClass2 to SubClass1
obj.move();
}
}
为什么我不能这样做?什么阻止我写这个?
答案 0 :(得分:2)
为什么我不能这样做?
SubClass2
不是SubClass1
是什么阻止我写这个?
您实际上无法将类型转换为Java中的引用。您只能将引用的类型更改为该对象实际所在的类型。你可能想要的是
SuperClass obj = new SubClass2(); // SubClass2 is a SuperClass
obj.move();
或者你可以
public class SubClass2 extends SubClass1 {
答案 1 :(得分:2)
因为SubClass2扩展了SuperClass,而不是SubClass1。
例如,假设SubClass1还包含成员变量x
和函数y()
。如果您可以从SubClass2转换为SubClass1,则变量x
和函数y()
将不存在,并且您的程序将失败。所以Java不允许这样做。
这两个子类只与它们扩展的类相关,而不是彼此相关。
答案 2 :(得分:1)
因为在多态性中,你不能用另一个兄弟来引用一个兄弟。 例如,在下图中,您可以执行以下操作:
Bicycle b1 = new MountainBike();
Bicycle b2 = new RoadBike();
Bicycle b3 = new TandemBike();
因为所有这些都有共同的超类。但是MountainBike
,RoadBike
和TandemBike
不能互相引用,因为它们正在相互竞争。
答案 3 :(得分:0)
让我们从OOP中举个例子。条件是子类SubClass1&的SuperClass父类。 SubClass2。
现在在代码中,您试图在SubClass1的引用中保存SubClass2的对象。现在,当您尝试创建链接时,它将如下图所示
现在,当你看到层次结构的子类有一个关系" sibling"不是"孩子 - 父母"哪里;由于孩子是由父母派生的,因此父母可以保留他们各自孩子的对象。但这并不意味着兄弟姐妹,因为两者都可以拥有自己的行为和属性版本(在这种情况下,如果java允许,可以有更多其他人可以拥有更多),或者说OOP允许兄弟像你的代码一样行为是正确的概念"物理问题以编程方式实施"会出错。