【问题标题】:Overriding with Superclass Reference for Subclass Object用子类对象的超类引用覆盖
【发布时间】:2023-04-11 00:06:01
【问题描述】:

为了自学 Java,我最近翻阅了几本书,幸运的是,主要是由于运气,遇到的困难很少。刚刚改变了。

我在继承和整个超类子类设置下阅读了以下部分

-- 当一个新的超类对象被创建时,它像所有对象一样被分配一个引用(本例中为superReference)

-- 如果创建了一个新的子类对象(定义子类扩展了超类),然后将 superReference 引用设置为引用该对象而不是原始对象,我的理解是,既然引用了对于超类,只有超类定义的成员才能从子类访问。

首先 - 这是正确的吗?

第二:如果我重写了一个方法,因此在超类中具有一个,在子类中具有一个,然后我创建一个超类对象,然后按照称为像 Dynamic Method Dispatch 之类的,被调用的重写方法应该默认访问子类方法吧?

好吧,我的问题是:

如果对超类对象的引用为子类对象重新工具,并且将拒绝直接 object.member 访问子类定义的成员,仅支持超类定义的成员,如果超类引用被重新工具为子类对象,如果访问受到超类起源引用的限制,则覆盖的方法适用于子类对象-

【问题讨论】:

  • 你在哪里读到的?这很令人困惑。你能用>引用什么不是你的文字吗?
  • 您显然很困惑,但由于源材料可能令人困惑,因此无法分辨出它的哪一部分。

标签: java oop overriding


【解决方案1】:

如果你尝试这样:

class SuperClass{
    int intVar = 0;
    void method(){
        //in super class
    }
}
class SubClass extends SuperClass{
    int intVar = 2;
    void method(){
        //in sub class
    }
}

然后

SuperClass obj = new SubClass();
int val = obj.intVar;// this is taken from SuperClass as variables are decided on reference basis
//if both superclass and subclass contain the same variable it is called shadowing
obj.method();// it is taken from the SubClass as it is method overriding 
//and is decided at runtime based on the object not the reference  

检查 cmets。希望这会有所帮助。

【讨论】:

  • 这只会增加混乱。如果您想澄清,请显示 intVarmethod() 的声明位置。
  • 谢谢,这很有帮助。这似乎是一个很棒的社区!也许是我使用 Schildt 书的错,因为我听说他们的准确性受到质疑。
  • @vishal_aim 你能提供一些链接吗?这个“在运行时根据对象而不是参考决定”
【解决方案2】:
only members defined by the superclass may be accessed from the subclass.

首先:这完全是错误的。子类可以毫无问题地访问它自己的成员。但是,一旦您将子类实例分配给超类变量(引用),您就只能调用只能从超类访问的方法或成员。这是你想说的吗?

Second : 将被执行的方法是实例(对象)中的方法。不是引用(变量)类型中的方法。所以是的,被覆盖的方法总是会被执行。

第三:子类可以覆盖方法但不能覆盖实例属性。超类中的任何成员变量也将在子类中。只要您保留现有的访问修饰符或使用更易于访问的访问修饰符,您就可以覆盖子类中的方法。

【讨论】:

    【解决方案3】:

    在 Oracle 文档中没有提及,或者至少没有明确或明确解释。在我看来,这种行为就像 C++ 中的虚拟方法,不同之处在于,在这种语言中,通过在基类或父类(java 中的超类)中定义的方法之前使用关键字 virtual 很清楚,并且必须在子类中重新定义。在 C++ 中没有虚拟变量,只有虚拟方法。

    在这种情况下,当我们有一个指向基类的指针(引用),该基类指向一个子类的实例,并且在父类和子类中存在具有相同签名的方法和具有相同名称的变量时,如果前面没有关键字virtual,则将执行的方法的定义是父类的定义,另一方面,子类中的定义将针对声明为的方法执行虚拟

    在变量的情况下,使用基类中的变量,而不是子类中的变量。

    恢复,相似之处是:

    -在java中,变量是根据引用取的 - 在 C++ 中没有虚拟变量

    所以在我们所说的情况下,隐藏在子类或子类中的变量不是采用而是隐藏的

    -在java中,方法是基于对象或实例来取的 - 在 C++ 中,虚拟方法必须在子类中重新定义,并采用这些方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多