Java Access Modifiers

时间:2013-05-30 05:40:50

标签: java access-modifiers

根据第二个文档表(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);
     }
}

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

5 个答案:

答案 0 :(得分:5)

看起来这两个类(Class1 & Class2)在同一个包中,同样的类HelloWorld它自己和default modifier在类或包中可见。

default modifierno modifier在java中具有重要性,它与private不同,并且它的访问级别在文档中已明确定义。

答案 1 :(得分:2)

Java语言规范writes

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

  • ...

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

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

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

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

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

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

由于Class1Class2是使用默认访问权限声明的,因此HelloWorld必须与它们位于同一个包中才能进行编译。

答案 2 :(得分:1)

它被称为包私有。包含同一包中的子类的任何类都可以访问默认修饰符。

请参阅扩展答案: In Java, difference between default, public, protected, and private

答案 3 :(得分:0)

如果修饰符是默认值,则可以访问其包。如果子类与超类相同意味着您可以获得结果。有关修饰符的进一步简要说明,请参阅我的blog

答案 4 :(得分:0)

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

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

可能是此链接可以帮助您了解更多信息。Access modifier in java with example