作用域 public,private,protected,以及不写时的区别:
作用域 | 当前类 | 同一package | 子孙类 | 其他 package非子孙类 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly | √ | √ | × | × |
private | √ | × | × | × |
不写时默认为 friendly
private修饰的作用域为其所有类,public任意类都可以访问,这两个比较容易理解。
protected是从类的继承关系上进行限制的,而friendly是从类文件的组织关系上进行限制的。
因此friendly修饰的作用域为同一个package,但是,protected修饰的在同一package的非继承类中也是可见的,这点需要注意。
在这点上的理解,可以考虑包的作用。
包的存在,是为了组织类文件或者类,类似于命名空间的概念。
类的组织应该遵循面向对象设计的一些基本原则,无关的类要隔离开来,先关的类要存放在一起。
因此,对于存放在一个包下的类,他们应该是能够互相访问的,因此即使没有继承关系,也可以访问到protected修饰的属性。
package anotherTest;
import test.A;
public class C extends A {
public void test() {
System.out.println(protectedX);
System.out.println(super.protectedX);
System.out.println(super.publicX);
}
public static void main(String[] args) {
(new C()).test();
}
}
package test;
public class B {
public void Test() {
A a = new A();
System.out.println(a.publicX);
System.out.println(a.friendlyX);
System.out.println(a.protectedX);
}
public static void main(String[] args) {
(new B()).Test();
}
}
package anotherTest;
import test.A;
public class C extends A {
public void test() {
System.out.println(protectedX);
System.out.println(super.protectedX);
System.out.println(super.publicX);
}
public static void main(String[] args) {
(new C()).test();
}
}