模块之间通过他们的api通信,一个模块不需要知道另外一个模块的内部情况,这就被称为信息隐藏或封装。
请问为什么需要封装?
答:需要封装的原因很多,其中大多数的原因都源于这么一个事实:你可以有效的解除组成系统个模块之间的耦合关系,使这些模块可以独立开发,测试,优化,修改,理解,这样可以加快系统开发的速度,因为这些模块可以并行开发。它也减轻了维护的负担,因为我们可以更快点的理解这些模块,并在调用的时候不影响其他模块。
封装提高了软件的可重用性,因为模块之间不紧密相连,最后封装也降低了构建大型系统的风险,即使整个系统不可用,但是这些模块可能是有用的。
使类和成员的可访问性最小化
对于顶层的类或接口,只有两种可能访问的级别:包级私有的(package private)和公有的(public),如果你使用了public修饰顶层类或接口,那它就是公有的;否则它就是包级私有的,通过把类或接口设计成包级私有的,它实际上成了这个包实现的一部分,在以后的版本重,可以对它进行修改,替换,或者删除,而无需担心会影响到现有客户端程序。如果你把它设计成public,你就有责任永远支持它,以保持他们的兼容性。
对于成员(域、方法、嵌套类和接口)有四种可能的访问级别,下面按照可访问性的递增顺序罗列出来:
私有的:只有在声明该成员的顶层类的内部才可以访问这个成员。
包级私有的:声明该成员的包内部的任何类都可以访问这个成员。它被成为缺省(default)访问级别。
受保护的(protected):声明该成员的类的子类可以风味这个成员变量,并且声明 该成员的包的内部的任何类也可以访问这个成员。
公有的(public)任何地发都可以访问该成员。
注意:长度非零的数组总是可变的,所以,类具有公有的静态final数组域。或者返回这种域的访问方法,这几乎总是错误的。如果类具有这样域或者访问方法,客户端将能够修改数组中的内容。这是安全漏洞的一个常见根源:
public static final Thing[] values={.......};
修改这个问题有两种方法。可以使用公有的数组变成私有的,并且增加一个公有的不可变列表
class ArraysAcess {
private static final String[] PRIVATE_VALUES ={"a","b","c","d"};
public static final List<String> values = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
}
//测试:
public static void main(String[] args) {
// TODO Auto-generated method stub
java.util.List<String> list = ArraysAcess.values;
list.add("abc");
for(int i=0;i<list.size();i++){
System.out.println("value:"+list.get(i));
}
}
就会报错如下:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1018)
at classandmemberacess.tets.main(tets.java:13)
因为这时候的数组变成了大小固定,不可修改的集合了。
另外一种修改方法是:
class ArraysAcess {
private static final String[] PRIVATE_VALUES = {"a","b","c","d"};
//second method
public static final String[] getValues(){
return PRIVATE_VALUES.clone();
}
}
分享到:
相关推荐
3. **封装(Encapsulation)**: 封装是面向对象的核心原则之一,它隐藏对象内部的实现细节,只对外提供接口进行交互。C++ 通过访问修饰符(public, private, protected)来实现封装,保护数据不被外部代码直接访问,...
信息隐藏(Information Hiding)是指软件设计的信息隐藏技术。数据封装(Data Encapsulation)是指软件设计的数据封装技术。 抽象数据类型(Abstract Data type)是指软件设计的抽象数据类型。模块化设计(Modular ...
4. 信息隐藏(Information Hiding):限制对对象内部数据的访问,防止数据被误用。 5. 一般性原则(Generality):设计的类应尽可能具有广泛的适用性。 6. 可扩展性原则(Extensibility):允许在不修改现有代码的...
3. **信息隐藏(Information Hiding)**:这是面向对象设计的重要原则,指的是通过访问控制(如公有、私有、受保护等)来隐藏类的内部实现细节,只对外提供必要的接口,防止外部代码对类的内部状态进行非法修改。...
### Java中的信息隐藏 (Information Hiding in Java) 在Java中,信息隐藏是通过使用私有(private)成员变量和适当的访问器(getters)及修改器(setters)来实现的。这种方法有助于保护对象的内部状态,并确保外部只能...
- **信息隐藏(Information Hiding)** - 信息隐藏是指限制类的外部用户直接访问类的内部数据和实现细节。通常通过设置访问权限来实现,比如将类的某些成员声明为私有(private)或受保护(protected)。 - **封装** - ...
5. **信息隐藏(Information Hiding)**:通过声明数据成员为私有(private),只有类内的成员函数和友元函数可以访问,实现对外部代码的隐藏,增强数据安全性。 6. **构造函数(Constructor)**:构造函数是与类...
1. 封装/信息隐藏(Encapsulation/Information Hiding): 封装是面向对象编程的关键特性,它允许将数据(属性)和操作数据的函数(方法)捆绑在一个单元——类中,确保数据的保护和控制。在Java中,通过访问修饰符...
- **用途**:封装是面向对象编程的一个基本原则,它指的是隐藏对象的具体实现细节,并通过公共接口与外部交互。 #### Exception [java] 例外; 异常 [ik'sep..n] - **中文释义**:异常 - **用途**:异常是在程序...
Encapsulation[java] 封装 (hiding implementation details) Exception [java] 例外; 异常 [ik'sepʃәn] entry n.登录项, 输入项, 条目['entri] enum (关键字) execute vt.执行 ['eksikju:t] exhibit v.显示, ...
1. 封装/信息隐藏(Encapsulation/information hiding) 2. 继承(Inheritance) 3. 多态/动态绑定(Polymorphism/dynamic binding) 4. 所有预定义类型都是对象(All predefined types are objects) 5. 所有操作都...