一、面向对象概述
-
当今主流的程序设计范型:面向对象程序设计(object-oriented programming,
OOP
)。 -
面向对象的程序是由对象组成的,每个对象包含对用户
公开的特定功能
部分和隐藏的实现
部分。 -
类:
-
类(class)是构造
对象的模板
或蓝图。 -
类(construct)构造对象的过程称为
创建类的实例
。
-
-
类之间的关系:
-
依赖(“uses-a”)
:一个类的方法使用或操纵另一个类的对象。 -
聚合(“has-a”)
:类A的对象包含类B的对象。 -
继承(“is-a”)
:一个更特殊的类与一个更一般的类之间的关系。
-
-
对象:
- 使用OOP,一定要清楚的三个主要特性:
-
对象的行为:可以对对象
完成哪些操作
,或者可以对对象应用哪些方法? -
对象的状态:当调用哪些方法时,对象会
如何响应
? -
对象的表示:
如何区分
具有相同行为
与状态不同
的对象
?
- 要想使用对象,首先必须构造对象,并指定其初始状态。然后对对象应用方法。
-
构造器:
-
构造器
与类同名
。 -
每个类可以有
一个以上
的构造器。 -
构造器可以有
0个
、1个
或多个参数
。 -
构造器
没有返回值
。 -
构造器总是伴随着
new
操作符一起调用。 -
不能对一个已经存在的对象
调用构造器来达到重新设置实例字段的目的。
-
-
方法参数:
-
Java程序设计语言总是采用
按值调用
的方式。 -
两种类型的方法参数:即
基本数据类型
、对象引用
。 -
this
关键字指示隐式参数,也就是所构造的对象。
-
-
静态字段与静态方法:
-
将一个字段定义为
static
,表示:它属于类
,而不属于任何单个的对象。 -
静态方法是不在对象上执行的方法,静态方法可以访问静态字段。
-
-
对象构造与重载:
public class Sample {
// 无参构造
public Sample() {
}
public static void method() {
System.out.println();
}
public static void method(int a) {
System.out.println(a);
}
public static void method(String str) {
System.out.println(str);
}
public static void main(String[] args) {
// 实例化无参构造
Sample sample = new Sample();
// 重载:多个方法,相同方法名,不同的参数。
// 签名:方法名 + 参数类型。
// 注:不能有签名完全相同却有不同返回类型的方法。
method();
method(1);
method("str");
}
}
- 更改器与访问器:
public class Sample {
private int number;
// 更改器
public void setNumber(int number) {
this.number = number;
}
// 访问器
public int getNumber() {
return number;
}
public static void main(String[] args) {
// 构造对象
Sample sample = new Sample();
// 调用字段更改器
sample.setNumber(1);
// 调用字段访问器
System.out.println(sample.getNumber()); // print 1
}
}
- 初始化块:
public class Sample {
private Sample() {
}
private int number;
{
number += 1;
System.out.println("初始化块:只要构造这个类的对象,就会被执行。");
}
static {
// doSomething...
System.out.println("静态初始化块:关键字static,如果类的静态字段需要很负载的初始化代码,则可以使用。");
}
public static void main(String[] args) {
Sample sample = new Sample();
// print 静态初始化块:...
// print 初始化块:...
}
}
二、类设计的技巧
-
一定要保证
数据私有
。 -
一定要
显式地初始化所有的数据
。 -
不要
在类中使用过多的基本类型
。 -
不是所有的字段都需要
单独的访问器
和更改器
。 -
分解
有过多职责的类
。 -
类名和方法名要能够体现它们的职责,
类名应当是一个名词
如Order,或者是前面有形容词修饰的名词如RushOrder,或者是有动名词如“-ing”后缀修饰的名词。 -
优先使用不可变类
,如果多个线程试图同时更新一个对象,就会发生并发更改,其结果是不可预料的。所以使用不可变类,就可以安全地在多个线程间共享对象。
三、结束语
“-------怕什么真理无穷,进一寸有一寸的欢喜。”
微信公众号搜索:饺子泡牛奶。