参考书籍:《java 核心技术卷1》
1、类之间的关系
依赖-(“uses-a”)
聚合-(“has-a”)
继承-(“is-a”)
依赖(“uses-a”),是一种最明显、最常见的关系。例如Order类使用Accout 类是因为Order对象需要访问Account对象查看信用状态。但是Item 类不依赖于Account类,这是因为Item对象于客户账户无关,因此,如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。
应该尽可能地将相互依赖的类减至最少。如果类A不知道类B的存在,它就不会关心B的任何改变(这意味着B的改变不会导致A 产生任何Bug。用软件工程的术语来说,就是让类之间的耦合度最小。
聚合(“has-a”),是一种具体且易于理解的关系。 例如,一个Order对象包含一些Item对象。聚合意味着类A的对象包含类B的对象。
继承(“is-a”),是一种用于表示特殊于一般关系的。例如,RushOrder类由Order继承而来。在具有特殊性的RushOrder类中包含了一些用于优先处理的特殊方法,以及一个计算运费的不同方法;而其他的方法,如添加商品、生产账单等都是从Order类继承而来的。一般而言,如果类A扩展类B,类A 不但包含从类B继承的方法,还会拥有一些额外的功能。
2、对象与对象变量
要想使用对象,就必须首先构造对象,并指定其初始状态。然后,对对象应用方法。
一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
3、对象构造
有些类有多个构造器,例如,可以如下构造一个空的StringBuilder对象:
StringBuilder messages = new StringBuilder();
或者,可以指定一个初始字符串:
StringBuilder todoList = new StringBulder("to do :");
这种特种叫做重载(overloading)。如果多个方法有相同的名字、不同的参数,便产生了重载。
如果在构造器中没有显示地给域赋予初值,那么就会被自动地赋为默认值:数值为0,、布尔值为false,对象引用为null。只有缺乏程序设计经验的程序员才会这么做。如果不明确地对域进行初始化,就会影响程序代码的可读性。
如果在编写一个类时没有编写构造器,那么系统就会提供一个无参构造器。这个构造器将所有的实例域设置为默认值。
初始化数据域的方法:
1、在构造器种设置值
2、在声明中赋值
3、初始化块
首先运行初始化块,然后才运行构造器的主体部分。
在类第一次加载的时候,将会进行静态域的初始化。
可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。在实际应用中,不要依赖于使用finalize方法回收任何短缺的资源,这是因为很难指定这个方法什么时候才能够调用。
4、类设计技巧
1、一定要保证数据私有
这是最重要的,绝对不要破坏封装性。当数据私有时,它们的表现形式的变化不会对类的使用者产生影响,即使出现bug也易于检测。
2、一定要对数据初始化
java不会对局部变量进行初始化,但是会对对象的实例域进行初始化。最好不要依赖于系统的默认值,而是应该显示地初始化所有的数据,具体的初始化方式可以是提供默认值,也可以是在所有的构造器中设置默认值。
3、不要在类中使用过多的基本类型
就是说哦,用其他的类代替多个相关的基本类型的使用。这样会使类更加易于理解且易于修改。
4、不是所有的域都需要独立的域访问器和域更改器
5、将职责过多的类进行分解
6、类名和方法名要能够体现它们的职责
7、优先使用不可变的类