java 访问权限控制知识补充

本博客参考《thinking in java》第6章, 省略了一些简单知识,补充了一下本人不熟易忘记的知识

  1. java解释器的运行过程如下:首先找出环境变量CLASSPATH,其中包括一个或者多个目录,用作查找.class文件的根目录;然后解释器获取包的名称并将每一个’.’替换为’\’(取决于你的操作系统),从而产生一个路径(例如foo.bar.baz 在windows下就会变成foo\bar\baz),这个路径会与你的CLASSPATH中的不同项相连接,于是解释器就会在这些目录下查找与你相关的类名称相关的class文件。
  2. 默认访问权限没有任何关键字,但通常是指包访问权限,这意味着当前的包中的所有其他类对那个成员都有访问权限,但是对于这个包之外的所有类,这个成员却是private的。
  3. 如果类的构造函数是private的,那么说明不可以通过构造器创建这个类的对象,这个方法可以运用于设计模式中的单例模式。
  4. 如果对类的某个成员使用了private关键字后,其他的任何类都无法访问这个成员,包括用一个包的其他类。
  5. 如果对类的某个成员使用protected关键字,那么对此成员的访问权限只是它的派生类而不是所有类,当然,protected提供包访问权限,即包中的其他类也可以访问protected元素。(注意,假设在包A中存在类Animal,此类方法有bite()方法,没有相关访问权限的关键字修饰它;假设包B中的Dog类继承Animal,那么Dog类中是可以使用bite()方法的,因为bite()方法实际上存在于Dog类中,但是请注意,包B中的其他类并不可以调用bite()方法)。
  6. 对于类的访问权限,仅有两个选择:包访问权限后者public。如果不希望其他任何人对该类拥有访问权限,那么可以将该类所有的构造器全部指定为private(当然,在该类的static成员中可以创建这个类对象)。根据此方法,可以写出设计模式中的单例模式:
1.  public class Soup{ 
 private Soup{} 
 private static Soup p = new Soup(); 
 public static Soup getInstance(){return p;} 
 }
  1. 如果没有能为类访问权限指定一个访问修饰符,那么它会默认得到包访问权限。同时,在相同目录下所有不具有明确package声明的文件,都会被视作该目录下默认包的一部分。然而,如果该类的某个static成员是public的话,则客户端还是可以调用该static成员,尽管他们并不能生成该类的对象。