对象与类
▲ 面向对象程序设计概述 ▲ 对象构造
▲ 使用预定义类 ▲ 用户自定义类
1. 面向对象程序设计概述
1.1 类:
将成员,方法,关系的抽象封装
由 变量/属性 和 方法/函数 组成
- 封装的关键:不能让类中的方法直接地访问其他类的实例域。程序仅通过对象的方法与对象数据进行交互(黑盒特性),提高了可靠性和重用性
类之间的关系:
•依赖(“uses-a”):一个类对象使用到另一个类
•关联(“has-a”):一个类包含1~多个其他类
•继承(“is-a”):一个类是另一个类的扩展
1.2 对象:
类的实列化。
- 对象的变量存放的是一个地址
三个主要特性:
1.对象的行为(behavior):即操作方法。
2.对象的状态(state):对行为的相应。
3.对象表示(ID):对象的辨别。
2. 用户自定义类
在 Java 中,最简单的类定义形式为:
class ClassName {
fieldi //成员变量
fieldi
...
constructori //构造器
constructori
...
methodi //方法
methodi
...
}
2.1 构造器:
构造器是一种特殊的方法, 用来构造并初始化对象。通过 new 操作返回一个引用
System.out.printTn(new DateO);//直接使用
Date birthday = new Date();//赋给变量
- 构造器与类同名
- 构造器可以有 0 个、1 个或多个参数
- 构造器总是伴随着 new 操作符的执行被调用
- 不要在构造器中定义与实例域重名的局部变量。
参数:
显式参数:一般是指形参变量
隐式参数:对象自身成员变量(this.x)
public void raiseSalary(double byPercent)
{
double raise = this.salary * byPercent / 100;
this.salary += raise;
}
参数名:
有些程序员在每个参数前面加上一个前缀"a"。
public Employee(String aNaie, double aSalary)
{
name = aName;
salary = aSalary;
}
2.2 重载:
相同的方法名字、不同的参数。
编译器通过参数类型与特定方法调用所不同的使用的值类型进行匹配来挑选出相应的方法。
indexOf(int)
indexOf(int, int)
indexOf(String)
indexOf(String, int)
- 如果在构造器中没有显式地给域赋予初值,那么就会被自动地赋为默认值:
数值为 0、 布尔值为 false、 对象引用为null
无参数的构造器:
其状态会设置为适当的默认值。
- 如果在编写一个类时没有编写构造器, 那么系统就会提供一个无参数构造器
- 如果类中提供了至少一个构造器, 但是没有提供无参数的构造器, 则在构造对象时如果没有提供参数就会被视为不合法。
对象析构与 finalize 方法:
由于 Java 有自动的垃圾回收器,不需要人工回收内存,所以 Java 不支持析构器。
- 某些对象使用了内存之外的其他资源, 例如文件。对象用完时,可以应用一个close方法来完成相应的清理操作
2.3 方法:
更改器方法:调用这个方法后,对象的状态会改变。(set)
访问器方法:只访问对象而不修改对象。(get)
- 注意不要编写返回引用可变对象的访问器方法。
class Employee {
private Date hireDay;
public Date getHireDay()
{
return hireDay; // Bad
}
}
//Date 对象是可变的,这一点就破坏了封装性
Employee harry = new Employee();
Date d = harry.getHireDay();
d.setTime(5);//错误,harry对象也被改变
- 如果需要返回一个可变对象的引用, 应该首先对它进行克隆(clone)。
class Employee {
private Date hireDay;
public Date getHireDay()
{
return (Date)hireDay.clone();
}
}
方法参数:
1.按值调用(call by value)
2.引用调用 (call by reference)
- Java 程序设计语言对对象采用的不是引用调用,实际上,对象引用是按值传递的。
public static void swap(Employee x, Employee y) // 交换不了x与y的地址
{
Employee temp = x;
x = y;
y = temp;
}
Employee a = new Employee("Alice", .. .);
Employee b = new Employee("Bob", . ..);
swap(a, b); //无效