Java中的典型分层继承
考虑下面的代码片段Java中的典型分层继承,java,inheritance,Java,Inheritance,考虑下面的代码片段 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 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();
}
}
为什么我不能这样做?是什么阻止我写这个
为什么我不能这样做
子类2不是子类1
是什么阻止我写这个
在Java中,实际上无法将类型转换为引用。只能将引用的类型更改为对象的实际类型。你可能想要的是
SuperClass obj = new SubClass2(); // SubClass2 is a SuperClass
obj.move();
或者你也可以
public class SubClass2 extends SubClass1 {
为什么我不能这样做
子类2不是子类1
是什么阻止我写这个
在Java中,实际上无法将类型转换为引用。只能将引用的类型更改为对象的实际类型。你可能想要的是
SuperClass obj = new SubClass2(); // SubClass2 is a SuperClass
obj.move();
或者你也可以
public class SubClass2 extends SubClass1 {
因为子类2扩展了超类,而不是子类1 例如,假设子类1还包含一个成员变量x和一个函数y。如果您可以从子类2转换为子类1,那么变量x和函数y将不存在,并且您的程序将失败。所以Java不允许这样做
这两个子类只与它们扩展的类相关,而不是彼此相关。因为子类2扩展了超类,而不是子类1 例如,假设子类1还包含一个成员变量x和一个函数y。如果您可以从子类2转换为子类1,那么变量x和函数y将不存在,并且您的程序将失败。所以Java不允许这样做
这两个子类只与它们扩展的类相关,而不是彼此相关。这是因为在多态性中,不能由另一个同级引用一个同级。 例如,在下图中,您可以执行以下操作:
Bicycle b1 = new MountainBike();
Bicycle b2 = new RoadBike();
Bicycle b3 = new TandemBike();
因为所有这些都有共同的超类。但山地车、公路车和坦坦德姆自行车不能互相指代,因为它们是兄弟姐妹
这是因为在多态性中,不能由另一个兄弟引用一个兄弟。 例如,在下图中,您可以执行以下操作:
Bicycle b1 = new MountainBike();
Bicycle b2 = new RoadBike();
Bicycle b3 = new TandemBike();
因为所有这些都有共同的超类。但山地车、公路车和坦坦德姆自行车不能互相指代,因为它们是兄弟姐妹
让我们以OOP为例。条件是子类1和子类2的超类父类 现在在代码中,您正试图在子类1的引用中保存子类2的对象。现在,当您尝试创建链接时,它将如下图所示
现在,当你看层次结构的子类是有一个关系的兄弟姐妹,而不是孩子的父母在哪里;由于子对象是由父对象派生的,因此父对象可以保存其各自的子对象。但这并不意味着兄弟姐妹都可以有自己版本的行为和属性,一个可以有更多,另一个可以有更少。在这种情况下,如果java允许,或者说OOP允许兄弟姐妹像您的代码一样行为是正确的,那么按语法实现的物理问题的概念将出错。让我们举一个例子哎呀。条件是子类1和子类2的超类父类 现在在代码中,您正试图在子类1的引用中保存子类2的对象。现在,当您尝试创建链接时,它将如下图所示
现在,当你看层次结构的子类是有一个关系的兄弟姐妹,而不是孩子的父母在哪里;由于子对象是由父对象派生的,因此父对象可以保存其各自的子对象。但这并不意味着兄弟姐妹可以有自己版本的行为和属性,如果java允许,一个可以有更多,另一个可以有更少,或者说OOP允许兄弟姐妹像你的代码一样行为是正确的,按语法实现的物理问题的概念会出错。你能解释一下你的想法吗也就是说,在这段代码中,实际上不能将Java中的类型转换为引用?您不能自动地将子类2这样的类型转换为子类1。这些是不同的类型。在C++等其他语言中,你可以提供一种转换方法来描述如何将子类1转换成子类2。你可以解释你所说的意思吗?实际上不能将类型转换成爪哇中的引用。你不能自动地将子类类型转换成子类1。这些是不同的类型。在其他语言如C++中,你可以提供一个转换方法来描述如何将子类1转换成子类2。你希望子类1 Obj=新子类2做什么?@我知道我们可以做超类obj=新的子类2;调用子类2的move方法,比如obj.move;但是我无法回答为什么我不能像SubClass1 obj=新SubClass2那样做??你希望SubClass1 obj=新SubClass2做什么?@Radiodef这是我最近遇到的问题。我知道我们可以做超类obj=新的子类2;调用子类2的move方法,比如obj.move;但无法回答为什么我不能像SubCl那样做 ass1 obj=新的子类2??