1

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

我写了这段代码:

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.

那么,为什么在使用关键字 inb声明时它的行为不像虚函数?privateA

4

2 回答 2

1

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

该类 B 声明具有相同签名的同名方法无关紧要。私有方法对 B 是完全不可见的,所以它也可以有一个不同的名称。这两种方法根本没有关系。

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

@Override. 然后编译器会告诉你它是否没有(你会在这个例子中得到一个编译错误),所以这有助于捕捉拼写错误、不匹配的签名和其他东西。

于 2012-11-21T06:05:14.897 回答
1

那是因为根据JLS

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

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

class Ex{
   protected void a()
   {        
   }
} 


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

    }
 }
`
于 2012-11-21T06:19:17.447 回答