Understanding inheritance and overriding
实际上,我的问题已经回答了,但我不能正确理解。以下是代码段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Superclass { public static void main (String[] args){ Superclass obj = new Subclass(); obj.doSomething(); #prints"from Superclass" } private void doSomething(){System.out.println("from Superclass");} } class Subclass extends Superclass { private void doSomething(){System.out.println("from Subclass");} } |
它打印出:"来自超类"
Since the reference type of the object obj is SuperClass, a call to
doSomething() tries to access the private method defined in SuperClass
itself (private methods cannot be overridden). As doSomething() is
accessible within SuperClass, the main method can call doSomething()
without giving any error/s.
就我所能想象的,方法调用是这样工作的:(也许我完全错了):
对象的实例只存储数据本身,而当我调用实例方法时,Java查看引用变量的类型,并从该类型的类调用方法。(在我看来,这是合乎逻辑的,并解释了为什么上面的代码打印"来自超类")。
但是,将第一个EDCOX1的0访问方法中的访问修饰符更改为"保护"使我感到困惑,因为如果引用类型是EDCOX1(1)而不是EDCOX1(2),我无法理解Java是如何知道有一个重写的。重写是否也会更改
或者我完全错了方法调用和重写是如何工作的?
如果有人能帮助我,解释我所缺少的东西,我会非常感激。
私有方法以及静态方法和所有变量都不能被重写,它们可以被隐藏。因此,您需要将方法的访问修饰符从private更改为任何其他访问修饰符。
注意:当重写一个方法时,有几个协议要遵循;子类中定义的方法的访问修饰符如果不能比被重写的方法更容易访问,则必须具有相同的访问级别。返回类型必须协变等…
重写方法的功能只是定义另一种使用继承执行相同方法的方法。
不,超能力根本不会改变(除非你在做一些奇怪的事情,但那是另一个故事)。
只有类本身可以"看到"方法时,才会使用private关键字。另一方面,protected关键字正好用于继承:类及其子级可以看到该方法。这就是为什么您只能重写受保护的方法。
因为您已经将"dosomething"定义为私有方法,所以重写不起作用。将其更改为public或protected,然后查看输出。
为了更好地理解它,在另一个Java文件中移动子类。现在告诉我,可以从对象句柄进行私有方法调用吗?