私人关键字和虚拟功能访问

时间:2012-11-21 06:03:23

标签: java

我正在学习Java,并尝试了解privateprotectedpublic修饰符如何影响绑定。

我写了这段代码:

public class A {

    public void a() {
        System.out.println("a in A.");
        b();
    }

    private void b() {
        System.out.println("b in A.");
    }


    public static void main(String[] args) {
        B obj = new B();
        obj.a();
    }
} 

class B extends A {
    public void b() {
        System.out.println("b in B.");
    }
}

输出结果为:

a in A.
b in A.

仍然,B拥有自己的b方法,objB的实例。为什么输出不是以下?

a in A.
b in B.

但是,如果我将b中的A方法更改为以下内容:

public void b() {
    System.out.println("b in A.");
}

输出变为预期:

a in A.
b in B.

那么,为什么bprivate中使用A关键字声明时,它的行为与虚函数不同?

2 个答案:

答案 0 :(得分:1)

因为私有方法(和字段)在类之外是不可见的,包括子类。因此私有方法不是外部接口的一部分,不能被覆盖。

B类声明一个具有相同签名的同名方法并不重要。私有方法对B完全不可见,因此它可能具有不同的名称。这两种方法完全没有关系。

当您创建方法public(或protected)时,它将成为类API的一部分,并且可以被覆盖。

这是一个很好的做法(并且IDE会自动为您执行此操作)来注释您认为使用@Override覆盖某些内容的所有方法。然后编译器会告诉你它是否没有(你会在这个例子中得到编译错误),所以这有助于捕捉拼写错误,不匹配的签名和东西。

答案 1 :(得分:1)

这是因为根据JLS

  

私有类成员或构造函数只能在包含成员或构造函数声明的顶级类(第7.6节)的主体内访问。它不是由子类继承的。

所以上面回答你的问题。 但如果案件是针对受保护或公开的,那么这是有效的:

class Ex{
   protected void a()
   {        
   }
} 


 class Child extends Ex{
    @Override
    public void a()
    {

    }
 }
`