对象构造
一、重载
类中方法名相同,参数不同即重载。返回类型可以不同也可以相同。Java中允许重载任何方法。
二、初始化
默认初始化:
在一个类的构造器里,如果没有显式的给域赋予初值,就会自动的被赋予默认值。
数值:0 布尔值:false 对象:null
构造器初始化:
如果在编写一个类时没有编写构造器,则系统会提供一个默认的构造器,采用默认值对实例域进行初始化。
但如果类中提供了构造器,再使用默认的构造器就会编译错误。
public Employee(String name , float salary)
{
this.name=name;
this.salary=salary;
}
当然一个构造器也可以调用同一个类的另外一个构造器,这样对于构造器公用部分只需要编写一次即可。
public Employee(float salary)
{
this.("Employee"+nextId,salary); //此处就会调用上面的public Employee(String name , float salary)构造器
nextId++;
}
显式域初始化:
所谓显式域初始化,即在类定义的时候为每个域赋予一个初始的值。这样在构造器被执行之前会先执行实例域的赋值。
public class Employee
{
private String name = "";
private float salary = 0 ;
public Employee()
{
}
}
当然初始化值也不一定非得是常量,也可以通过调用方法来进行初始化。
public class Employee
{
static int getId()
{
int r = nextId;
nextId++;
return r
}
private int id = getId();
private static int nextId = 1 ;
}
初始化块:
所谓初始化块,也即在类的声明中包含代码块,在类构造对象的时候,这些代码块就会被执行。
public class Employee
{
private int id ;
{ //实例域初始化块
id = nextId;
nextId++;
}
}
静态域初始化块,在块标示static即可
static
{
Random generator = new Random();
nextId = generator.nextInt(10000);
}
静态域初始化可以编写没有main方法的的程序:
public class Test18
{
static //静态域初始化块
{
System.out.println("No Main");
System.exit(0); //避免抛出的异常
}
}
三、析构器与finalize方法
Java有自动的垃圾回收器,不需要人工回收内存,所以Java不支持析构器。
但对于其它资源,可以通过为类提供finalize方法处理。finalize方法在一个类被垃圾回收器回收之前被调用。
但由于垃圾回收器是自动回收的,所以不知道finalize方法的执行时间是未知的,对于短缺的资源不建议使用finalize方法。
public class Test19
{
public static void main(String[] args)
{
Test19 test = new Test19();
test = null; //对象test已经没有意义了
System.gc(); //手动调用垃圾回收器,虽然手动调用了,但也不能保证垃圾回收器会立即回收。
}
public void finalize()
{
System.out.println("被垃圾回收器回收了...");
}
}
从运行结果可以看出,虽然System.gc()被调用了,但也不会立即垃圾回收。当垃圾回收的时候finalize方法被执行
一些资源在使用完毕后需要立刻关闭释放的,需要人工管理。一般会提供类似dispose或者close方法来做相应的清理工作,如果一个类提供了这样的方法,则在对象不用的时候一定要调用该方法。
四、包
包的导入:
直接导入包可以避免在每个类名之前需要写完整路径。
import java.util.* ;
当发生命名冲突时,例如java.util.*和java.sql.*中都包含Date类,这时候就需要指定使用的是哪个Date,如下就指定了java.util.Date
import java.util.*;
import java.sql.*;
import java.util.Date;
如果两个Date类型都需要的话,那只能在每个类声明上加上完整路径。
静态导入:
导入静态方法和静态域(不常用)
import static java.lang.System.*;
导入后就可以直接
out.println("-------");
exit(0);
五、类设计技巧(Java2核心技术)
1、一定将数据设为私有
2、一定要对数据初始化
3、不要在类中使用过多的基本数据类型
4、不是所有的域都需要独立的域访问器和域更改器
5、使用标准格式进行类的定义
6、将职责过多的类进行拆分
7、类名和方法名要体现它们的职责