gpt4 book ai didi

java - 从父类公共(public)成员调用的子类私有(private)成员

转载 作者:行者123 更新时间:2023-11-30 07:44:11 27 4
gpt4 key购买 nike

下面的代码发生了什么?请解释输出:

class Parent{
private void fun(){
System.out.println("parent fun\n");
}
public void accessFun(){
System.out.println(this);
this.fun();
}
}

class Child extends Parent{
private void fun(){
System.out.println("child fun");
}
}

class Test{
public static void main(String[] args) {
Child a = new Child();
Parent b = new Parent();
Parent c = new Child();
a.accessFun();
b.accessFun();
c.accessFun();
}
}

输出:

Child@7960847b

parent fun

Parent@3b192d32

parent fun

Child@16f65612

parent fun

为什么 this.fun() 行没有给出编译时错误?

我认为 fun 是 Child 类中的私有(private)成员,因此不能从 Child 类外部(从它的 Parent 类的公共(public)成员)访问。

为什么 this.fun() 调用了 fun() 的父类版本?注意 this 指的是子类对象。

最佳答案

私有(private)成员不被继承。

我认为这可能是您在这里遗漏的关键点。这意味着 Child.fun 不会覆盖 Parent.fun。它们只是两个彼此无关的普通旧方法。

当您调用 accessFun 时,控制总是进入 Parent 中的这段代码:

public void accessFun(){
System.out.println(this);
this.fun(); <---- here
}

现在,因为我们现在在 Parent 中,所以我们可以访问 fun。由于 Parent.fun 未被覆盖,它调用 Parent.fun 而不是 Child.fun

I think fun is a private member in child class and therefore can't be accessed from outside the class(may even from public member of it's Parent class).

这完全是误解。如果不能从类外部访问私有(private)成员,甚至不能通过公共(public)方法访问,那么它们的用处就会大打折扣。为什么要将它们放在首位?

“私有(private)成员只能由在同一类中声明的成员访问”可能更值得记住。

关于java - 从父类公共(public)成员调用的子类私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52752870/

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