根据第二个文档表(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);
}
}
如果无法从子类访问没有访问修饰符的成员,为什么在此示例中打印? 它应该抛出一个错误,就像私有访问修饰符一样,不应该吗?
答案 0 :(得分:5)
看起来这两个类(Class1 & Class2
)在同一个包中,同样的类HelloWorld
它自己和default modifier
在类或包中可见。
default modifier
或no modifier
在java中具有重要性,它与private
不同,并且它的访问级别在文档中已明确定义。
答案 1 :(得分:2)
Java语言规范writes:
如果顶级类或接口类型未声明为public,则只能从声明它的包中访问它。
...
只有在类型可访问且成员或构造函数时,才能访问引用(类,接口或数组)类型的成员(类,接口,字段或方法)或类类型的构造函数。声明允许访问:
如果成员或构造函数被声明为public,....
否则,如果成员或构造函数被声明为protected,...
否则,如果成员或构造函数被声明为私有,...
否则,我们说有默认访问权限,只有在声明类型的包中发生访问时才允许访问。
因此访问是否来自子类并不重要,重要的是包。
由于Class1
和Class2
是使用默认访问权限声明的,因此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