1

根据文档的第二个表(http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html),没有标识符的成员对子类不可见。
但是,当我运行以下示例代码时,会打印“1”(b 的内容)!

class Class1{
    private int a=0;
    int b=1;
    protected int c=2;
    public int d=3;
}

class Class2 extends Class1{ }

public class HelloWorld{

     public static void main(String []args){
        Class2 klass=new Class2();
        System.out.println(klass.b);
     }
}

如果一个没有访问修饰符的成员不能从子类访问,为什么在这个例子中打印它?
它应该抛出一个错误,就像在私有访问修饰符中一样,不是吗?

4

5 回答 5

5

看起来两个 class( Class1 & Class2) 都在同一个包中,而且HelloWorld它本身也在同一个类中,并且default modifier在类或包中可见。

default modifierno modifier在java中具有重要意义,它与文档不同,private并且它的访问级别在文档中得到了很好的定义。

于 2013-05-30T05:43:00.527 回答
2

Java 语言规范写道

  • 如果顶级类或接口类型未声明为公共的,则只能从声明它的包内访问它。

  • ...

  • 引用(类、接口或数组)类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问并且声明成员或构造函数允许访问时才可访问:

    • 如果成员或构造函数被声明为 public,......

    • 否则,如果成员或构造函数被声明为受保护,...

    • 否则,如果成员或构造函数被声明为私有,...

    • 否则,我们说有默认访问,只有当访问发生在声明类型的包内时才被允许。

所以访问是否来自子类并不重要,重要的是包。

由于Class1Class2被声明为具有默认访问权限,HelloWorld因此必须与它们在同一个包中才能编译。

于 2013-05-30T06:05:14.373 回答
1

这就是所谓的包私有。同一包中的任何类(包括子类)都可以访问默认修饰符。

请参阅扩展答案: 在 Java 中,default、public、protected 和 private 之间的区别

于 2013-05-30T05:43:53.603 回答
0

如果你的修饰符是默认的,你可以通过它的包访问。如果子类与超类相同,则意味着您可以获得结果。有关修饰符的进一步简要说明,请关注我的博客

于 2014-04-21T04:55:39.423 回答
0

在同一个包中,子类可以访问其父类的所有成员元素,这就是它能够打印SOP语句的原因。因为默认修饰符被称为包私有意味着它可以在同一个包中访问。

是的,当您进入另一个包时,再次使用子类对象,您可以使用默认修饰符访问成员变量。

可能这个链接会帮助你了解更多。java中的访问修饰符示例

于 2015-12-28T06:35:26.567 回答