从父类公共成员调用的子类私有成员

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


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() 的父类版本?请注意,这是指子类对象。


BIG阳
浏览 117回答 3
3回答

一只斗牛犬

私有成员不会被继承。我认为这可能是您在这里遗漏的关键点。这意味着Child.fun不会覆盖Parent.fun. 它们只是两个简单的旧方法,彼此无关。当你调用时accessFun,控制总是进入下面的这段代码Parent:public void accessFun(){&nbsp; &nbsp; System.out.println(this);&nbsp; &nbsp; this.fun(); <---- here}现在,因为我们现在在里面Parent,我们可以访问fun. 而且,由于Parent.fun是没有被覆盖,它调用Parent.fun而不是Child.fun。我认为 fun 是子类中的私有成员,因此无法从类外部访问(甚至可以从其父类的公共成员访问)。那是完全的误解。如果不能从类的外部访问私有成员,甚至不能通过公共方法访问,那么它们的用处就会小得多。为什么首先要拥有它们?“私有成员只能由在同一类中声明的成员访问”可能更好记住。

守着一只汪

我认为 fun 是子类中的私有成员,因此无法从类外部访问(甚至可以从其父类的公共成员访问)。有时一切都来自“外部”。例如,main呼叫来自外部。如果不能从外部访问私有成员,则它始终是死代码,这是没有意义的。区别在于对直接访问和间接访问的理解。在所有情况下,您都可以通过 method 非直接调用该方法accessFun()。

达令说

parent 中的 fun 方法是私有的,子 fun() 方法不会覆盖父 fun() 方法。但是 accessFun 方法是公共的,因此它可以从子类中调用并且可以公开访问。因此,当您调用 accessFun() 方法时,它将调用父类 fun() 方法。不是子类 fun() 方法,因为它是私有的。这就是为什么你不会出错的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java