访问控制与“最初的实现并不恰当”有关
- 包
- 类的访问权限
- 方法和成员的访问权限
包结构
- 一个文件如HelloWorld.java被称为一个编译单元。
- 包内必须有一个 HelloWorld的类,是public的类,其他类对外不可访问。
- package hello;将许多文件从属同一个群组;目录结构应该放在hello下面。
- import hello.HelloWorld 或者import hello.*; 就可以导入其他类,并进行使用。
- 目录结构配合package关键字,保证包名独一无二。 例如
package net.mindview.simple; public Print { }
文件应该结构为:X:\xxx\net\mindview\simple\Print.java - import配合classpass 寻找包 ,X:\xxx 应该在CLASSPATH变量中。
- import static net.mindview.simple.Print.*; 可以导入静态方法,直接使用。
类的访问权限
public 的类同一个包可以直接使用,不同包需要import。
不可以是private或者protect。 非public的类,只有包访问权限,包外无法访问方法和成员的访问权限
类内部,无论是哪种权限修饰符,都可以互相访问。
类外部,
public的方法/成员,可以被访问到。 (无论是对象访问,还是静态成员访问。无论包内,包外。)private的方法/成员,不可以被外部(包内/包外)访问到。
(内部可以,内部的static方法也可以创建对象进行访问)包访问权限,允许包内访问,包外无法访问。
protected,继承父类的方法,如果是public,就可以访问,如果是private,就不能访问。protect的方法可以访问。
看一下如下表格就一目了然:
名称 | 包外 | 包外继承 | 包内继承 | 包内 |
---|---|---|---|---|
public | 可以 | 可以 | 可以 | 可以 |
protected | 不可以 | 可以 | 可以 | 可以 |
包访问 | 不可以 | 不可以 | 可以 | 可以 |
private | 不可以 | 不可以 | 不可以 | 不可以 |
注:包内,protected方法的都可以访问到。
TIJ的记法,public都可以,private都不可以,包访问包内可以。protected给包外的继承打开了一扇小窗。
被访问的类如下: (再分别写四个类,包外、包外继承、包内继承、包内 访问 Test1的四个方法,可以得出上表的结论)
package access.solution;import static net.mindview.util.Print.*;public class Test1 { public void foo1(){ print("public foo1"); } protected void foo2(){ print("protected foo2"); } void foo3(){ print("default foo3"); } private void foo4(){ print("private foo4"); } public static void main(String[] args){ Test1 a = new Test1(); a.foo1(); a.foo2(); a.foo3(); a.foo4(); }}