类实例化可以生成对象,实例方法就是对象方法,实例变量就是对象属性。一个对象的生命周期包括三个阶段:创建,使用和销毁。
12.1创建对象
创建对象包括两个步骤:声明和实例化
1.声明
声明对象和声明普通变量没有区别,格式如下:
type objectName;
其中,type是引用类型,即类,接口和数组。示例:
String name;
该语句声明了字符串对象name。可以声明并不为对象分配内存空间,而只是分配一个引用
2.实例化
实例化过程分为两个阶段:为对象分配内存空间和初始化对象,首先使用new运算符为对象分配内存空间,然后再调用构造方法初始化对象。示例:
String Name;
name = new String(“Hello World”);
代码中String(“Hello World”)表达式就是调用String的构造方法。
12.2空对象
一个引用变量没有通过new分配内存空间,这个对象就是空对象。Java使用关键字null表示空对象。示例:
String name = null;
name = “Hello World”;
引用变量默认值是null。当试图调用一个空对象的实例变量或实例方法时,会抛出空指针异常NullPointerException,代码如下
String name = null;
//输出null字符串
System.out.println(name);
//调用length()方法
int len = name.length();
但是代码运行到第1行时,系统会抛出异常,这是因为调用length()方法时,name是空对象。程序员应该避免调用空对象的成员变量和方法。代码如下:
//判断对象是否为null
if(name != null){
int len = name.length;
}
12.3构造方法
(1)构造方法名必须与类名相同。
(2)构造方法没有任何返回值,包括void。
(3)构造方法只能与new运算符结合使用。
示例:
package ConstructionMethod;
public class Rectangle {
//矩形宽度
int width;
//矩形高度
int height;
//矩形面积
int area;
//构造方法
public Rectangle(int w, int h) {
width = w;
height = h;
area = getArea(w, h);
}
private int getArea(int w, int h) {
// TODO Auto-generated method stub
return 0;
}
}
12.3.1默认构造方法
有时在类中根本看不到任何的构造方法。
例子:
package ConstructionMethod;
public class User {
//用户名
private String username;
//用户密码
private String password;
}
在上述代码中看不见任何的构造方法,但是还是可以调用无参数的构造方法创建User对象。
例子:
User user = new User();
默认构造方法的方法体中没有任何语句,也就不能初始化成员变量了,那么这时候成员变量就会使用默认值,成员变量默认值与数据类型有关。
12.3.2构造方法重载
在一个类中可以有多个构造方法,它们具有相同的名字(与类名相同),参数列表不同,所以它们之间一定是重载关系。
package ConstructionMethod;
import java.util.Date;
//构造方法重载
public class Person {
//名字
private String name;
//年龄
private int age;
//出生日期
private Date birthDate;
public Person(String n, int a, Date d) {
name = n;
age = a;
birthDate = d;
}
public Person(String n, int a) {
name = n;
age = a;
}
public Person(String n, Date d) {
name = n;
birthDate = d;
}
public Person(String n) {
name = n;
}
public String getInfo() {
StringBuilder sb = new StringBuilder();
sb.append("名字:").append(name).append('\n');
sb.append("年龄:").append(age).append('\n');
sb.append("出生日期:").append(birthDate).append('\n');
return sb.toString();
}
}
上述代码Person类代码提供了四个重载的构造方法,如果有准确的姓名,年龄,出生日期信息,就可以用第一个构造方法构造Person对象;如果只有姓名和年龄信息,可以选用第二个构造方法创建Person对象;如果只有姓名和出生日期信息,可以选用第三个方法构造Person对象;如果只有姓名信息,可以选用第四种方法构造创建Person对象。
12.3.3构造方法封装
//构造方法封装
package ConstructionMethod;
import java.util.Date;
//构造方法重载
public class Person2 {
//名字
private String name;
//年龄
private int age;
//出生日期
private Date birthDate;
//公有级别限制
public void Person(String n, int a, Date d) {
name = n;
age = a;
birthDate = d;
}
//默认级别限制
void Person(String n, int a) {
name = n;
age = a;
}
//保护级别限制
protected void Person(String n, Date d) {
name = n;
birthDate = d;
}
//私有级别限制
private void Person(String n) {
name = n;
}
public String getInfo() {
StringBuilder sb = new StringBuilder();
sb.append("名字:").append(name).append('\n');
sb.append("年龄:").append(age).append('\n');
sb.append("出生日期:").append(birthDate).append('\n');
return sb.toString();
}
}
上述代码,第一种是声明公有级别的构造方法。第二种是声明默认级别,默认级别只能在同一个包中访问。第三种是保护级别的构造方法,该构造方法在同一个包中和默认级别相同,在不同包中可以被子类继承。第三种是私有级别构造,这种构造方法只能在当前类中使用,不允许在外边访问,私有构造方法可以应用于设计模式等设计。
12.4this关键字
this指向对象本身,一个类可以通过this来获得一个代表它自身的对象变量。this使用在如下三种情况中。
1.调用实例变量
2.调用实例方法
3.调用其他构造方法、
例子:
//this关键字
package ConstructionMethod;
import java.util.Date;
//构造方法重载
public class Person3 {
//名字
private String name;
//年龄
private int age;
//出生日期
private Date birthDate;
public void Person(String name, int age, Date d) {
this.name = name;
this.age = age;
birthDate = d;
}
public void Person(String name, int age) {
//调用三个参数构造方法
this(name, age, null);
}
public void Person(String name, Date d) {
//调用三个参数构造方法
this(name, 30, d);
}
public Person(String name) {
System.out.println(this.toString());
//调用Person(String name, Date d)构造方法
this(name, null);
}
@Override
public String toString() {
return "Person [name=" +name
+ ", age = " + age
+ ", birthDate= " + birthDate + "]";
}
}
12.5销毁对象
对象不再使用时应该被销毁。