gpt4 book ai didi

Java 继承 - 请解释

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:43:47 25 4
gpt4 key购买 nike

class A {
public void talk(){
this.sayIt();
}

private void sayIt(){
System.out.println("class A says...");
}
}

class B extends A {
private void sayIt(){
System.out.println("class B says...");
}
}

测试类,主要方法:

B b = new B();
b.talk()

//output
class A says...

我无法得到这个,因为:

B 类 继承自 A 类,公共(public)成员并且不能看到/继承私有(private)函数。所以在B 类 中,我们可以调用talk()//因为是父类继承的。

现在,在 talk() 方法中,调用了 sayIt(),因为 sayIt() 是在 B级,

我希望在执行 this.sayIt() 时调用 B.sayIt()

“this”不是指B类吗?

请解释。

最佳答案

因为您将 sayIt() 定义为私有(private)的,B 类无法覆盖它。因此,您有两个 sayIt() 定义,而不仅仅是一个被子类覆盖的定义。

在 A 类代码的一部分中,它将始终调用 A 类的版本,即使 B 类版本是 protected 或公开的。这是因为 A 类只知道 A 类的版本,因为 B 类版本不是覆盖,而是一个完全不同的方法,恰好共享相同的名称。

虽然在 B 类代码的一部分内部,它总是会调用 B 类的版本,因为 A 类版本被标记为私有(private)。正如其他人所指出的,如果您将定义更改为 protected 或公共(public),它将对 B 类可见,并且它将执行您想要的操作。

请注意,如果您要使用默认(包)可见性,则范围规则会变得非常复杂,并且实际结果会有所不同,具体取决于哪些子类在同一包中,哪些在不同的包中。

关于Java 继承 - 请解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1738148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com