访问权限控制
1-2 编译 编译单元
当编译一个编译单元(.java文件)时,在编译单元中的每个类都会有一个后缀名为.class的输出文件。
例:
class Pen{} class Book{} public class Box { }

编译后生成的文件为:

1-3 import语句
当编译器碰到import语句时,就会在CLASSPATH所指定的目录中查找import关键字后的目录或者文件,然后从已经编译的文件中找出名称相符者。
二.Java访问权限修饰词
Java权限可分为public>protected>default(包访问权限)>private;
如上顺序靠前的权限修饰词拥有顺序在其后权限修饰词的特性。如,protected>default(包访问权限)表明:用protected修饰的方法(属性等)也相当于被default修饰。即,用protected修饰的方法除了能被其本类和其子类访问到外,也能被在其同一个包中的其他类访问到。
2-1 public访问权限
使用关键字public,意味着public之后紧跟着的成员,对每个类来说都是可以去访问的。
2-2 protected访问权限
使用关键字protected,意味着protected之后紧跟着的成员,只有继承了包含该成员的类的子类才可以访问。
2-3 包访问权限
- 默认访问权限不使用任何权限修饰词,通常是指包访问权限。
- 一个编译单元只能隶属于一个包,这个包是离它最近的包。

如上图中的MyClass编译单元,只能说它属于包c,而不能说它也属于包b或包a。
- 将一个类的某个成员的访问权限设置为包访问权限,这意味着该类所在包中的所有类都可以访问到该成员,而其他所有包中的所有类都访问不到该成员。这句话可简单理解为:只有包路径一致的类之间才可以互相访问对方的具有包访问权限的成员。这也同样适用于在同一个编译单元中的类,因为他们的包路径是一致的。

如上图有A,B,B1,C4个类,他们的包路径分别为:
| 类名 |
包路径
|
| A | com.test.a |
| B | com.test.a.b |
| B1 | com.test.a.b |
| C | com.test.a.b.c |
对于类B来说,他能访问的具有包访问权限的成员,只有其本身和与其包路径相同的类B1的。b包内的c包和在b包外的a包中的类的具有包访问权限的成员都不能被B类访问到。
public class A { static String name = "class A"; } public class B { static String name = "class B"; public static void main(String[] args) { System.out.println(A.name); System.out.println(B1.name); System.out.println(C.name); } } public class B1 { static String name = "class B1"; } public class B { static String name = "class B"; public static void main(String[] args) { System.out.println(A.name);//访问不到 System.out.println(B.name); System.out.println(B1.name); System.out.println(C.name);//访问不到 } } public class C { static String name = "class C"; }
2-4 private访问权限
使用关键字private,意味着private之后紧跟着的成员,除了包含该成员的类之外,其他任何类都无法访问这个成员。
三.类的访问权限
- 在Java中,访问权限修饰词也可用于修饰类。如果希望某个类可以被所有类使用,就可以通过关键字public作用于整个类的定义来达到目的;如果希望一个类只能在一个包的范围内使用,那么可用通过在类定义前不加任何权限关键字在(包访问权限)来实现。
- 除内部类之外的其他类的访问权限只有public和包访问权限两个选择。
- 每个编译单元至多只能有一个用public修饰的类,且这个public类的名字必须与包含该类的编译单元的名字完全匹配,包括大小写。

浙公网安备 33010602011771号