家长班级公开成员召集的儿童班级私有成员

时间:2018-10-11 05:32:39

标签: java

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

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类的私有成员,因此不能从Child类之外(从其Parent类的公共成员中)访问。

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

4 个答案:

答案 0 :(得分:3)

不继承私有成员。

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

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

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

现在,由于我们现在位于Parent内部,因此我们可以访问fun。并且由于Parent.fun未被覆盖的,因此它将调用Parent.fun而不是Child.fun

  

我认为乐趣是孩子班级的私人成员,因此不能从班级外部访问(甚至可以从其父班级的公共成员那里访问)。

那是一个完全的误解。如果不能从类外部访问私有成员,甚至不能通过公共方法访问私有成员,那么它们的作用将大大减少。为什么还要放在第一位呢?

“只能由在同一类中声明的成员访问私有成员”可能是一个更好的记住方式。

答案 1 :(得分:0)

父对象中的

private fun()由同一个父类的public accessFun()调用。 public accessFun()在Test类的main()中被调用。
这里的accessFun()是公共的,因此可以从任何地方调用它。
例如,就像Pojo类一样,私有成员可以通过公共设置者和获取者来访问

答案 2 :(得分:0)

父级中的fun方法是私有的,子级fun()方法未覆盖父级fun()方法。但是accessFun方法是公共的,因此可以从子类中调用它,并且可以公共访问。

因此,当您调用accessFun()方法时,它将调用父类fun()方法。不是子类的fun()方法,因为它是私有的。这就是为什么您不会收到错误的原因。

答案 3 :(得分:0)

  

我认为乐趣是孩子班级的私人成员,因此不能从班级外部访问(甚至可以从其父班级的公共成员那里访问)。

有时候,一切都来自“外部”。例如,main呼叫来自外部。

如果无法从外部访问私有成员,那么它将始终是无效代码,这是没有道理的。

区别在于对直接访问和间接访问的理解。

在所有情况下,您都直接通过方法accessFun()间接调用该方法。