当前位置: 首页 > 知识库问答 >
问题:

使用子类对象的超类引用重写

翟理
2023-03-14

我最近一直在翻阅几本书,以便自学Java幸运的是,主要是由于运气,我遇到的困难很少。这种情况刚刚改变。

我在继承和整个超类子类设置下阅读了下面的一节

--创建新的超类对象时,与所有对象一样,会为其指定一个引用(本例中为superReference)

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

首先,这是正确的吗?

第二:如果我正在重写一个方法,因此在超级中有一个,在子中有一个,我创建了一个超类对象,然后像我上面做的那样,将其引用分配给一个子类对象,根据称为动态方法分派之类的原则,被调用的重写方法应该默认访问子类方法,对吗?

我的问题是:

如果对超类对象的引用是为子类对象重新配置的,并且将拒绝直接object.member访问子类定义的成员,只支持超类定义的成员,那么如果为子类对象重新配置了超类引用,如果访问受到超类起源引用的限制,则如何将重写的方法应用于子类对象?

共有3个答案

公冶谦
2023-03-14

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

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

对于变量,取基类中的变量,而不是子类中的变量

恢复时,相似之处如下:

-在java中,变量是基于引用获取的——在C中没有虚拟变量

因此,在我们讨论的情况下,隐藏子类或子类中的变量不是被接受的,而是被隐藏的

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

漆雕彦
2023-03-14
only members defined by the superclass may be accessed from the subclass.

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

第二:将要执行的方法是实例(对象)中的方法。不是引用(变量)类型中的方法。因此,总是会执行被重写的方法。

第三:子类可以重写方法,但不能重写实例属性。超类中的任何成员变量都将位于子类中。你可以覆盖子类中的方法,只要你保留它们现有的访问修饰符或者使用更容易访问的访问修饰符。

顾超
2023-03-14

如果你想:

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  

查看评论。希望这能有所帮助。

 类似资料:
  • 问题内容: Java中的以下代码在elipse上运行时,即使我们将其替换,也会提供相同的输出 与, 请注意,我们已经覆盖了方法。 输出为: 码: 请指出,用这两种方式创建子类对象有什么区别。并且访问方法和变量是否有任何区别?(我们的Java老师说,两种情况下访问方法和变量都不同) 同样,静态方法(例如main)会发生什么。艰难的我知道它是可继承的,但是有人可以在子类中突出它的行为吗? 问题答案:

  • 问题内容: 我有一个扩展其超类的子类的对象。子类中有一个重写的方法,可以使用对象调用该方法。可以使用子类对象调用超类的函数吗? 考虑上面的代码。 它在这里打印 子类去 。相反,我必须打印 超类去 。 问题答案: 不,这是不可能的,如果您认为需要,请重新考虑您的设计。覆盖方法的全部要点是替换其功能。如果一个不同的类对该类的内部工作非常了解,那么您将完全取消封装。

  • 问题内容: SuperClass object = new SubClass(); 为什么使用超类实例化上面的子类对象?因为我学会实例化对象的唯一方法是: 我正在学习Java。 问题答案: 您可能有一个仅接受实例的方法。由于 是 ,您可以使用的实例并将其视为。 使用接口时,会使用相同的行为: 这就是多态的美。它允许您更改类内部的实现,而无需破坏其余代码。

  • 好的,我的基本类层次结构如下: 这是形状和圆的代码。无需阅读,仅供参考;无论如何,主要是getter和setter。如果我的错误不明显,我建议最后看看它们。 还有circle课程。 我的问题与以下代码执行的结果有关: 注意:很抱歉代码太多;我只是不知道抽象类是否有什么奇怪的地方,或者是误解的真正根源。 我无法解释输出,其内容如下: 由此可以看出,第一个print命令引用的是toString的cir

  • 问题内容: 我正在向我的朋友解释OOP。我无法回答这个问题。(我有多可耻? 我只是想逃避,因为OOP描绘了现实世界。在现实世界中,父母可以容纳孩子,但孩子不能容纳父母。OOP也是如此。我知道它很愚蠢。:P 为什么此陈述无效? 因为aChild的成员是aParent成员的超集。那为什么孩子不能容纳父母。 问题答案: 正是因为aChild是aParent功能的超集。你可以写: 因为每只狐狸都是动物。但

  • 假设我有一个抽象类Person。有另一个类学生扩展了Person。但是学生类有一个成员变量,比如String类型的学院,它在Person类中不存在。 我们知道我们可以从超类引用子类,例如, 人p=新学生(); 对象p会有成员学院吗?