我们从现实世界中的对象抽象出类,然后根据现实世界中的类编写软件系统中的类,而程序在运行过程中是对象之间在交互,需要不停的创建对象,下面介绍如何创建对象。

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()));
  }
 }

关于异常处理,在后面介绍。关于日期参见:第十六讲 日期和时间的使用