我们从现实世界中的对象抽象出类,然后根据现实世界中的类编写软件系统中的类,而程序在运行过程中是对象之间在交互,需要不停的创建对象,下面介绍如何创建对象。
1、对象的实例化
对象的创建是通过关键字new调用类的构造方法完成的,也称为对象的实例化,例如要创建Person的对象,可以使用下面的代码:
new Person();
如果构造方法需要参数,在调用的时候需要提供参数,例如:
new Person("张三");
2、对象引用
为了以后能够访问该对象,通常需要创建一个对象引用来指向该对象,例如下面的代码:
Person p = new Person("张三");
Person p的作用是什么呢?类似于int a,定义了一个变量p,类型为Person,我们通常称这个p为对象引用,而Person是这个对象引用的类型,有时候我们所说的对象指的是这个对象的引用,对对象的访问是通过这个引用完成的,与C++中的指针类似。
3、对象方法访问
接下来就可以访问新创建的对象的方法了。
p.setHeight(165);
只要Person的方法允许访问,就可以通过p加上“.”进行访问。
需要注意,在访问某个对象时要确保对象引用指向了对象实例,例如下面的代码将产生错误:
Person p;
p.setName("李四");
这时候会报错,错误为:NullPointException。虽然定义了对象引用p,但是没有把p指向某个具体的对象(又称为实例),所以p的值是null,所以在调用p的方法的时候会产生NullPointException。
4、对象成员的初始化
构造方法用于对成员变量进行初始化,如果在构造方法中没有对某个成员变量进行初始化,则系统会给定默认值。如果是基本类型的成员变量,给定的默认值如下:
char类型:编码为0的字符
数字(byte short int long):0
float类型和double类型:0.0
布尔类型:false
如果是引用类型的成员变量(非基本类型),则给定默认值为null,通常可以在实例化对象之后在对成员变量赋值,可以通过set方法完成。有时候也会提供专门的初始化访问,例如initialize。例如:
Person p = new Person();
p.setName("李四");
p.setHeight(175);
在调用对象的引用类型成员变量的时候,一定要确保不是null。
5、完整的代码
下面是完整的代码:
package test;
import java.text.SimpleDateFormat;
import java.util.Date;public class Person {
private int[] a;
private int height; private Date birthday;
private String name;
public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(String name, int height) {
this(name);
this.height = height;
}
public int getHeight() {
return height;
} public void setHeight(int height) {
this.height = height;
} public static void main(String args[]){
// 创建对象并实例化
Person p = new Person();
// 对成员变量赋值
p.setName("李四");
p.setHeight(175);
String birthday = "1989-3-11";
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try{
p.setBirthday(df.parse(birthday));
}catch(Exception e){
}
// 输出成员变量的值
System.out.println("姓名为:"+p.getName());
System.out.println("身高为:"+p.getHeight());
System.out.println("生日为:"+df.format(p.getBirthday()));
}
}
关于异常处理,在后面介绍。关于日期参见:第十六讲 日期和时间的使用