学习java第二周了,对java这门语言有了更深的理解。
本周并没有多学什么新知识,而是复习巩固了面向对象这部分的内容,因为我觉得这部分计较基础和重要,囫囵吞枣一遍过去有种不踏实感,所以在实练的同时又在这上面多花了些时间。以下是对这部分内容的复习总结。
一,对象和类
1.基本概念
面向对象的程序是由对象组成的,每个对象包含对客户公开的特定功能部分和隐藏的实现部分。程序中的很多对象来自标准库,还有一些是自定义的。究竟是自己构造对象,还是从外界购买对象完全取决于开发项目的预算和时间。但是,从根本上说,只要对象能够满足要求,就不必关心其功能到底是如何实现的。
类是构造对象的模板或蓝图。我们可以将类想象成制作小甜饼的模具,将对象想象为小甜饼。由类构造对象的过程称为创建类的实例。
封装是处理对象的一个重要概念。从形式上看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。对象中的数据称为实例字段,操作数据的过程称为方法。作为一个类的实例,特定对象都有一组特定的实例字段值。这些值的集合就是这个对象的当前状态。无论何时,只要在对象上调用一个方法,它的状态就有可能发生改变。
类之间的关系有依赖(“uses-a"),聚合("has-a"),继承(”is-a")。
2.使用预定义类
2.1 对象与对象变量
要使用构造器构造新实例,以Date类为例。
构造器的名字应该与类名相同,并且需要在构造器前面加上new操作符,如:
new Date() //构造新对象
System.out.println(new Date()); //将这个对象传递给一个方法
System s = new Date().toString(); //应用toString方法
Date brithday = new Date(); //存放在一个变量中
对象变量并没有实际包含一个对象,它只是引用一个对象。
可以显示地将变量设置为null,指示这个对象变量目前没有引用任何对象。
2.2 更改器方法与访问器方法
只访问对象而不修改对象的方法有时称为访问器方法。
调用后对象状态发生改变的方法称为更改器方法。
3.用户自定义类
源文件名必须与public类的名字相匹配。在一个源文件中,只能有一个公共类,但可以有任意数目的非公共类。
javac Employee*.java
javac Employee.java
以上两种方法可以编译源程序。
3.1 构造器
a.构造器与类同名
b.每个类可以有一个以上的构造器
c.构造器可以有0个、1个或多个参数
d.构造器没有返回值
e.构造器总是伴随着new操作符一起调用
3.2 实例字段
- 静态变量
public calss Math
{
...
public static final double PI = 3.14;
...
}
- final实例字段
class Employee
{
private final String name;
}
不能再修改这个字符
- 静态字段
class Employee
{
private static int nextId=1;
private int id;
}
每个类只有一个
- 用var声明局部变量
Employee harry = new Employee("Harry Hacher",5000,1989,10,1);
var harry = new Employee("Harry Hacher",5000,1989,10,1);
使用var关键字只能用于方法中的局部变量,参数和字段的类型必须说明。
使用null引用。
3.3 参数
- 隐式参数与显示参数:
public void raiseSalary(double byPercent)
{
double raise = this.salary *byPercent/100;
this.salary += raise;
}
- 方法参数
按值调用表示方法接收的时调用者提供的量,而按引用调用表示方法接收的 是调用着提供的变量地址。
两种方法参数类型: 基本数据类型(数字、布尔值)
对象引用
3.4 方法
- 静态方法
静态方法是不在对象上执行的方法,换句话说,它没有隐式参数,不可以访问实例字段,但可以访问静态字段。
public static int getNextInt()
{
return nextId; //return static field
}
- 工厂方法
- main方法
main方法也是一个静态,方法不对任何对象进行操作,事实上,在启动程序时还没有任何对象。
静态的main方法将执行并构造程序所需要的对象。
4.对象构造
4.1 重载
有些类有多个构造器。例如,可以如下构造一个空的StringBuilderd对象:
var messages = new StringBuilder();
或者,可以指定一个初始字符串:
var todoList = new StringBuilder("To do:\n);
这种功能叫做重载,如果多个方法 有相同的没名字、不同的参数,便出现了重载。
4.2 默认字段初始化
如果在构造器中没有显式的为字段设置初值,那么就会被自动的赋为默认值:数值为0、布尔值为false、对象引用为null。
4.3 无参数的构造器
由无参数构造器创建对象时,对象的状态会设置为适当的默认值。
4.4 显式字段初始化
可以在类定义中直接为任何字段赋值,在执行构造器之前先完成这个赋值操作。初始值不一定是常量值。
class Employee
{
private static int nextId;
private int id = assingnId();
...
private static int assignId()
{
int r = nextId();
nextId++;
return r;
}
}
4.5 调用另一个构造器
如果构造器的第一个语句形如this(...),这个构造器将调用同一个类的另一个构造器。
public Employee(double s);
{
this("Employee #" + nextId s);
nextId++;
}
4.6 初始化块
在一个类的声明中,可以包含任意多个代码块。只要构造这个类的对象,这些块就会被执行。无论使用哪个构造器构造对象,初始化块都会被实现。首先运行初始化块,然后才运行构造器的主体部分。
4.7 对象析构与finalize方法
如果一个资源一旦使用完就需要立即关闭,那么应当提供一个close方法来完成必要的清理工作。可以在对象使用完时调用这个close方法’
如果可以等到虚拟机退出,那么可以用方法Runtime.addShutdownHook增加一个”关闭钩“。