创建对象的过程
创建对象的过程分为四步:
- 分配对象空间,并将对象的成员变量初始化为0或空
- 执行属性的显式初始化
- 执行构造方法
- 返回对象的地址给相关的变量
this的本质
this的本质就是“创建好的对象的地址”,由于在构造方法调用前,对象已经创建,因此,在构造方法中也可以使用this代表“当前对象”
注意:
this不能用于static方法中
调用构造器
public class TestThis {
int a, b, c;
TestThis(int a, int b) {
this.a = a;
this.b = b;
}
TestThis(int a, int b, int c) {
this(a,b); //调用构造器,不能使用TestThis(a,b),而且必须放在构造方法的第一行代码
this.c = c;
}
void sing() {
}
void eat() {
this.sing(); //调用本类中的sing();
System.out.println("你妈妈喊你回家吃饭咯!");
}
public static void main(String[] args) {
TestThis hi = new TestThis(2, 3);
hi.eat();
}
}
输出结果:
你妈妈喊你回家吃饭咯!
this关键字最常用的用法
java中,this关键字一般有以下三种用法:
this.属性:代表本类属性
this调用本类方法:代表调用本类方法
this:代表当前对象
针对这三种用法,分别结合代码来进行说明
代表本类属性
先来一段没有使用this的代码:
public class ThisTest1 {
public static void main(String[] args) {
ThisDemo thisDemo = new ThisDemo("李四", "杭州");
System.out.println(thisDemo.get());
}
}
class ThisDemo {
private String name;
private String address;
public ThisDemo(String n, String a) {
name = n;
address = a;
}
public String get() {
return "名字:" + name + ", 地址:" + address;
}
}
输出结果:
名字:李四, 地址:杭州
我们可以看下上面代码ThisDemo类的构造方法中两个形参n和a,这种参数命名没有意义,代码维护性比较差,这两个参数目的是为了给属性name和address初始化赋值用的,那么构造方法的这两个参数名称最好也是name和address
修改构造方法的形参名称,代码如下:
public class ThisTest1 {
public static void main(String[] args) {
ThisDemo thisDemo = new ThisDemo("李四", "杭州");
System.out.println(thisDemo.get());
}
}
class ThisDemo {
private String name;
private String address;
public ThisDemo(String name, String address) {
name = name;
address = address;
}
public String get() {
return "名字:" + name + ", 地址:" + address;
}
}
输出结果为:
名字:null, 地址:null
上面的代码构造方法形参命名虽然有意义了,但输出结果不是我们想要的,属性name和address没有初始化值了。这是因为在java程序之中是以一对大括号”{}”来作为分界,采用就近原则。此时,可以使用this关键字来表示属性为类属性。
public ThisDemo(String name, String address) {
this.name = name;
this.address = address;
}
开发建议:只要是调用本类中的属性,都使用“this.属性”的方式来进行
代表调用本类方法
类方法分为两种:
普通方法:如果调用本类的普通方法,可以使用“this.方法()”调用
构造方法:如果调用本类的构造方法,可以使用”this(参数…)”调用
调用类的普通方法
这个比较简单,直接上代码:
public class ThisTest2 {
public static void main(String[] args) {
ThisDemo2 thisDemo = new ThisDemo2("李四", "杭州");
System.out.println(thisDemo.get2());
}
}
class ThisDemo2 {
private String name;
private String address;
public ThisDemo2(String name, String address) {
this.name = name;
this.address = address;
}
public String get() {
return "名字:" + name + ", 地址:" + address;
}
public String get2() {
return this.get();
}
}
输出结果为:
名字:李四, 地址:杭州
可以看到get2()方法中使用了this.get()
调用本类的普通方法
调用类的构造方法
举例: 假如一个类中有三个构造方法(无参、一个参数、两个参数),代码如下:
public class ThisTest3 {
public static void main(String[] args) {
ThisDemo3 thisDemo = new ThisDemo3("李四", "杭州人间天堂");
System.out.println(thisDemo.get());
}
}
class ThisDemo3 {
private String name;
private String address;
public ThisDemo3() {
System.out.println("创建了一个新的ThisDemo3实例......");
}
public ThisDemo3(String name) {
this.name = name;
System.out.println("创建了一个新的ThisDemo3实例......");
}
public ThisDemo3(String name, String address) {
this.name = name;
this.address = address;
System.out.println("创建了一个新的ThisDemo3实例......");
}
public String get() {
return "名字:" + name + ", 地址:" + address;
}
}
输出结果为:
创建了一个新的ThisDemo3实例......
名字:李四, 地址:杭州人间天堂
可以看到上面的代码有大量重复情况,那么我们这时候就可以使用this调用构造方法来简化我们的代码,让代码看起来清爽简洁。
public class ThisTest4 {
public static void main(String[] args) {
ThisDemo4 thisDemo = new ThisDemo4("李四", "杭州人间天堂");
System.out.println(thisDemo.get());
}
}
class ThisDemo4 {
private String name;
private String address;
public ThisDemo4() {
System.out.println("创建了一个新的ThisDemo4实例......");
}
public ThisDemo4(String name) {
this();
this.name = name;
}
public ThisDemo4(String name, String address) {
this(name);
this.address = address;
}
public String get() {
return "名字:" + name + ", 地址:" + address;
}
}
输出结果为:
创建了一个新的ThisDemo3实例......
名字:李四, 地址:杭州人间天堂
上面就是使用this调用构造方法的优化后的代码,没有重复代码,看起来简洁多了。
这里要注意的是:所有的构造方法都是在对象实例化的时候被默认调用,且是在调用普通方法之前,所以在使用this()调用构造方法,一定要放在构造方法的第一行
public ThisDemo4(String name, String address) {
this(name); //放在第一行
this.address = address;
}
代表当前对象
先了解下当前对象是代表啥意思?当前对象就是指当前正在调用类中方法的对象。
先看下代码:
public class ThisTest4 {
public static void main(String[] args) {
ThisDemo4 thisDemo = new ThisDemo4("李四", "杭州人间天堂");
System.out.println(thisDemo);
System.out.println(thisDemo.get());
}
}
class ThisDemo4 {
private String name;
private String address;
public ThisDemo4() {
System.out.println("创建了一个新的ThisDemo4实例......");
}
public ThisDemo4(String name) {
this();
this.name = name;
}
public ThisDemo4(String name, String address) {
this(name);
this.address = address;
}
public String get() {
System.out.println("当前对象this:"+this);
return "名字:" + name + ", 地址:" + address;
}
}
输出结果:
创建了一个新的ThisDemo4实例......
com.trc.java.ThisDemo4@8efb846
当前对象this:com.trc.java.ThisDemo4@8efb846
名字:李四, 地址:杭州人间天堂
可以看到,this其实就是当前创建的对象