类:
由类构造对象的过程称为创建类的实例。
//程序 = 算法 + 数据结构;
0.类设计技巧
-
一定要保证数据私有;
-
一定要对数据初始化;
-
不要在类中使用过多的基本类型;
-
不是所有的域都需要独立的域访问器和域更改器;
-
将职责过多的类进行分解;
-
类名和方法名要能够体现它们的职责;
-
优先使用不可变的类;
a.面对对象程序设计(OPP)
将数据放在第一位,然后再考虑操作数据的算法。OPP更加适用于解决规模较大的问题。
b.封装:(encapsulate,数据隐藏)
形式上:将数据和行为组合在一个包中,并对对象的使用者隐藏数据的实现方式。
// 对象数据 => 实例域
// 操纵数据的过程 => 方法method
// 每个类对象都有一组特定的@实例域值
// 实例域值的集合就是这个对象的@当前状态state
// 每个发送给类对象的信号,都可能改变state
封装的关键在于:决不能让类中的方法直接的访问其他类的实例域。程序仅通过对象的方法与对象数据进行交互。(提高重用性和可靠性的关键)
封装提供的内容:
c.对象三要特性:
d.面对对象程序设计步骤:先设计类(框架)后添加方法。
e.类之间的关系:
不管是以上的那种类关系,都会提高类之间的耦合度。在满足需求的情况下,应该尽量解耦优化程序,以便于类独立。
f.构造器
要想使用对象,就必须首先构造对象,并指定其初始状态。然后,对对象应用方法
构造器(constructor)是一种特殊的方法,用来构造并初始化对象。
//* 以类 Date 为例
Date dayDate = new Date(); // 构造对象,并被初始化为当前的日期和时间
new Date() //对象
Date day_date; // 对象变量而非对象,相当于指针,不具有对象的任何特性
// <classtype> <object> = new <class>;
如果把一个变量的值赋另一个变量,两个变量就指向同一个日期,即它们是同一个对象的指针所有的java对象都存储在堆中。当一个对象包含另一个对象变量时,这个变量依然包含着指向另一个堆对象的指针。
g.更改器(setting)和访问器(getting)
除此之外的方法既不改变对象状态,也无法访问对象状态。
注意:不要编写返回引用可变对象的访问器方法。若需要返回一个可变对象的引用,应该返回他的克隆副本。这样就无法通过访问器返回的对象直接修改类内对象。
//eg:
class ...{
<class> <object>;
public <class> getting(){
return (<class>) <object>.clone();
}
}
h.访问权限
不提倡用public标记实例域,public数据域允许程序中的任何方法对其进行读取和修改,这破坏了封装。建议将实例域标记为private
i.隐式参数与显式参数
在每一个方法中,this表示隐式参数,用this获取参数,可以将实例域与局部变量区分开。
j.类的访问权限
一个方法可以访问所属类的所有对象的私有数据。
k.私有方法
实现私有方法,只需要将public修改为private。私有方法只能在类内使用,当私有方法实现的功能被其他方法替代时,可以直接删除方法,而不用在意其他代码的依赖。
l.final实例域
构建对象时必须初始化这样的域,必须确保在每个构造器执行之后,这个域的值被设置。
m.静态方法
是不能项对象实施操作的方法,可认为是没有this参数的方法。
n.main方法
在启动程序时还没有任何的对象。静态的main方法将执行并创建程序所需要的对象。
每一个类可以有一个main方法,这是一个常用于对类进行单元测试的技巧。
o.方法参数
一个方法不可能修改一个基本数据类型的参数,而对象引用作为参数就不同了。
java对象引用是按参数传递的。
p.重载
java允许重载任何方法。
一个类具有多个构造器,有相同的名字,不同的参数,可能不同的返回值。
方法名以及参数类型为方法的签名,而返回值不是。
q.调用另一个构造器
//eg
public <class>(<type> <T>){
this("<class> #" + <type> <T1>, <type> <T2>);
}
这样对公共的构造器代码部分只编写一次即可。
r.调用构造器的具体处理步骤:
s.静态初始化块
如果对类的静态域进行初始化的代码比较复杂,那么就可以使用静态的初始化块。在类第一次加载的时候,将会进行静态域的初始化。
public class <class>{
static{
...
}
}
t.包作用域
标记为private的类只有在同一个中的其他类可以访问。只有类内方法与变量设为private才能防止外部访问
u.文档注释与类注释
注释以/*开始,并以/结束,每个文档注释在标记后紧跟这自由格式文本。