【问题标题】:Trying to understand class inheritance in java试图理解java中的类继承
【发布时间】:2018-10-24 16:37:00
【问题描述】:

可以说我有超类

public class SuperSub {
  public void overideThisMethod(){
    System.out.println("Printed from Superclass");
  }
}

我有一个像这样的子类,

public class SubClass2 extends SuperSub { 
  @Override
  public void overideThisMethod(){
    System.out.println("from subclass2");
  }
  public static void main(String[] args){
    SubClass2 subClass2= new SubClass2();
    subClass2.overideThisMethod();
    SuperSub superSub = new SuperSub();
    superSub.overideThisMethod();
  }
}

我在运行程序时得到输出:

run:
from subclass2
Printed from Superclass

输出应该不是,

run:
from subclass2
from subclass2

非常感谢任何澄清,谢谢!

【问题讨论】:

  • 您在分配给超类引用时忘记创建子类对象而不是超类对象。
  • @rgettman 是的,你是对的,我的朋友,谢谢!

标签: java superclass subclassing


【解决方案1】:

扩展(也称为继承)不会修改超类,但实际上使用您定义的扩展创建一个新的,就像那里的覆盖一样。

所以,这两个类都存在,每个类都有自己的逻辑。

在这里,您正在创建一个名为SuperSub 的类,它会打印“Printed from Superclass”。然后你使用它作为基础来创建另一个类SubClass2,它“掩盖”(也就是覆盖)基本行为,在这种情况下通过打印“来自 subclass2”来代替。

这样,如果您创建一个 SuperSub 类的对象,它的行为仍然是 SuperSub。 分别地,如果你创建一个 SubClass2 类的对象,它会表现得像 SuperSub 和你在 SubClass2 中定义的“扩展”(在这种情况下被覆盖的行为)。

【讨论】:

    【解决方案2】:

    在您的示例中,SubClass2 类扩展了 SuperSub,这意味着实例 SuperSub2 调用的所有方法在功能上都与实例 SuperSub 调用的方法相同,除了您的那些已覆盖。

    对于变量subClass2,它是SubClass2 的一个实例,这意味着它可以调用SuperSub 以及SubClass2 的所有方法。

    对于两个类中都存在的方法,在您的情况下为overideThisMethod,将根据您的变量的类型调用相应的方法。对于变量subClass2,它是类SubClass2 的一个实例,因此它调用其各自的方法(并打印“来自子类2”)。而变量superSubSuperSub 类的一个实例,因此它在自己的类中调用overideThisMethod 变量并打印(“从超类打印”)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 2014-02-22
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多