在看了设计模式-迪米特法则之后,应该就可以理解Java中对象的封装。
什么是封装?
在Java中定义了类,其实有点类似于面向过程设计中定义一个结构体一样,但是有个概念必须清楚,那就是定义类不等于做好了封装。封装是遵循迪米特法则的,就是让调用时不用去了解内的内部构造,只需要调用相应的对外方法即可。
具体说来可以归结为两点:
- 封装对象操作流程
- 封装对象内部数据
在Java中定义了public 、protected、private权限修饰符以及没定义任何权限的情况下的包权限,其中:
private声明的成员为私有的,用户无法在其他的类的代码中直接存取。
“包范围权限”声明的成员,在不同的的类程序代码中,也是不能直接存储的。
如果想在其他类中存取某包的类或对象成员,则该类或对象成员必须是public成员,使用public修饰符声明为公有成员。
类封装的Q&A
Q:为什么要将类声明为public?
A:如果你想在其他包的程序代码中存取某包的类或对象成员,则该类的成员必须是公开成员,在Java中用public修饰。
Q: final关键字的意思?
A: 如果一个类被设置为final,那么表示其他类不能在继承这个类了。如果一个变量声明为final,那么表示这个变量被设置值之后,这个值就不能再变了,其他地方就不能再对x有设置值的操作,否则会编译报错。
Q:static类成员的使用。
A1: 被static修饰的方法或变量,属于类拥有不会让个别对象拥有,记得单例模式中private static final Singleton instance = new Singleton();
static修饰这个单例的实例就会在类中实例化。
注意,在声明为static{}代码区块或方法中不能使用this关键字。因为static成员属于类,而非个别对象,所以在static中使用this是一种语义上的错误,编译不会通过。如图:虽然没有使用this.i,但是隐含了this.i的意思。所以会导致编译错误,同理,在static区块中,也不能调用非static的方法或区块。
A2:如果想在JVM加载xx.class之后执行一些操作,那么可以把这些操作定义static区块,比如单例模式中,在加载Singleton.class之后,会初始化好(private static final Singleton instance = new Singleton();
) 单例对象。
小结
在Java中,构造函数实现了对象初始化流程的封装。方法封装了操作对象的流程。封装主要是为了隐藏对象的细节,在Java中常用private封装对象数据成员,比如典型的单例模式,使用private修饰构造函数,使得在其他类无法通过new来获取类的对象,只能通过其内部共有的方法public static Singleton getInstance(){}
来获取类的实例对象。
在static区块或方法中不能出现this关键字。static方法中不能使用非static的数据或方法成员。