1、java解释器搜索包的过程:首先,它会找到环境变量CLASSPATH, CLASSPATH中包含了多个目录,它们作为系统的一种特殊的“根”,从这里开始对.class文件的搜索,从根开始,解释器将会寻找包名(一般的,包名是域名的点分割形式),并将点号解释成斜杠形式,生成从CLASSPATH根开始的路径名。
2、java编译器遇到import语句时,会从CLASSPATH指定的路径下搜索目录,若为导入的类创建对象,则编译器会在指定的目录下寻找同名的.class文件。
3、java访问控制符:
A: 方法和变量的可见性
访问控制符 | 对所在类的可见性 | 对同个包中的类的可见性 (同个包中可能有子类哟!) | 对继承子类的可见性 (该子类可能在不同包哟!) | 对不在同个包中的类的可见性 |
public | 可见 | 可见 | 可见 | 可见 |
protected | 可见 | 可见 | 可见 | 不可见 |
默认(无控制符) | 可见 | 可见 | 不可见 | 不可见 |
private | 可见 | 不可见 | 不可见 | 不可见 |
2. 并不是说方法或变量使用了默认控制符修饰时,那么它肯定对子类不可见。父类和子类在同一个包中时,父类的默认控制符对子类是可见的。
B: 类的可见性
访问控制符 | 对同个文件中的类的可见性 | 对同个包中的类的可见性 | 对不同包中的可见性 |
public | 可见 | 可见 | 可见 |
默认(无控制符) | 可见 | 可见 | 不可见 |
特别地,如果不想让任何人访问某个类时,可以将类中所有构造方法的控制符设为private,这样就任何人就不能为该类创建对象了,However,如果该类中某个static成员(变量或方法)的控制符是public时,外部任何类照样可以访问这个static成员,即使该类不能被创建对象。例如:
我们将类B的构造方法设为private后,就不能创建B 的对象了,但是别人如何使用这个类呢?就可以通过public属性的static方法来返回创建私有的static对象,这样就可以间接访问B类了。
class B {
private B() {}
public static void printB1(){
System.out.println("B.printB1()");
}
private static B b1 = new B();
public static B accessB() {
return b1;
}
public void printB2() {
System.out.println("B.printB2()");
}
}
public class A {
public static void main(String[] args) {
//B b2 = new B(); 不能创建B类的对象
B.printB1();
B.accessB().printB2();
}
}
运行结果:
B.printB1()
B.printB2()