解读:java提供了四种访问权限的修饰,在设计类的时候要尽可能让类或者它的成员可访问性最小。这也属于信息隐藏或封装。
- 那么为什么要这么做?
1、隐藏所有实现的细节,把它提供给外界的功能和自身的实现清晰的隔离出来,使得外界并不需要关系模块内部的细节。
2、有效地解除组成系统的各模块之间的耦合程度,使得每个模块都更独立,减轻维护的负担。例如你设计的一个类是包可见的,那么在后面的修改该类中你就不用担心包之外的调用会受到影响。
- java中的访问控制权限
类的访问范围
A、public修饰类,表示该类在所有包中可见
B、(default)修饰类,表示该类仅在同一个包中可见
注意:不能用protected和private修饰类成员变量及成员方法的访问范围
A、public 包内、包外,所有类中可见
B、protected 包内所有类可见,包外有继承关系的子类可见
(子类对象可调用)
C、(default)表示默认,不仅本类访问,而且是同包可见。
D、private 仅在同一类中可见
- 关于成员变量的不可直接被外界修改的说明:
1、实例域绝对不能是公有的,静态域也不例外,除了公有静态final域作为常量的特殊情况外。所谓作为常量是值:要么是基本类型的值,要么是指向不可变对象的引用。换句话说就是不能让外界能修改到实例域!!
2、类具有公有的静态final数组域,或者返回这种域的访问方法(虽然变量声明的是私有的),这种情况坚决不允许出现。这个其实就和公有静态final域指向的是一个可变对象情况类似,虽然表面上这个成员是不可变的,实际上不可变的只是引用,引用的对象由于不是可变的,是可以任意修改的。
3、那么如何解决呢?也就是不能直接作为public让外界访问到并且也不能提供get方法直接返回成员变量,而是返回一个不可修改的变量或者拷贝出的一份。如下面的代码:
public class Test1 {
private static final Test[] test = {new Test("a"),new Test("b")};
//返回一个不准修改的集合
public static final List<Test> getValues(){
return Collections.unmodifiableList(Arrays.asList(test));
}
//返回克隆出来的数组
public static final Test[] getValuesClone(){
return test.clone();
}
}