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??