首页 > 代码库 > 【小白的java成长系列】——this关键字

【小白的java成长系列】——this关键字

先来看一下下面这段代码:

package me.javen.oop;

public class ThisDemo {

	public static void main(String[] args) {
		Dog dog =  new Dog("小花", 10);//创建对象
		System.out.println(dog);
	}

}

class Dog{
	private String name;
	private int age;
	
	public Dog(){}//无参构造
	
	public Dog(String name,int age){//有参构造
		name = name;
		age = age;
	}

	@Override
	public String toString() {//重写Object中toString方法,前面Object类中讲解过
		return "Dog [name=" + name + ", age=" + age + "]";
	}
}

运行结果为:

Dog [name=null, age=0]

看到没有,没有设置上去,实例化的时候,name和age属性的值没有设置上去....

分析:

我们从实例化过程下手:

Dog dog =  new Dog("小花", 10);其实调用的是Dog中的有参构造,这个前面讲过的,没什么问题吧~

进入有参构造:

name = name;
age = age;

大家会很奇怪,这边不是已经赋值了吗~

问题:这两个name和age分别表示的是什么?

当然前面的name和age表示的是类的属性,后面的name和age表示的传递的参数呀。。错~~这两个name和age都是就近取的,都是表示传递的参数,因为属性名是一样的。

修改如下:

public Dog(String name,int age){
		this.name = name;//特指当前类中的属性
		this.age = age;
	}
运行结果:

Dog [name=小花, age=10]

那this关键字的作用是啥呢?其实你只要这么理解就可以的,this表示当前,什么的当前?当然是类的当前,对象的当前~可能这句话不好理解。举例:this.name = name --> this.name表示的就是当前类的name属性。

当然除了表示类之外还可以表示方法,也是当前的方法~也可以表示对象。

表示当前对象:

package me.javen.oop;

public class ThisDemo {

	public static void main(String[] args) {
		Dog dog =  new Dog("小花", 10);
		dog.printDog();//此时方法里面的this表示的就是dog这个对象
	}

}

class Dog{
	private String name;
	private int age;
	
	public Dog(){}
	
	public Dog(String name,int age){
		this.name = name;//特指当前类中的属性
		this.age = age;
	}
	
	public void printDog() {
		System.out.print(this);//表示当前的对象
	}

	@Override
	public String toString() {//重写Object中toString方法,前面Object类中讲解过
		return "Dog [name=" + name + ", age=" + age + "]";
	}
}

运行结果:

Dog [name=小花, age=10]


表示当前的方法:

class Dog{
	private String name;
	private int age;
	
	public Dog(){}
	
	public Dog(String name,int age){
		this.name = name;//特指当前类中的属性
		this.age = age;
	}
	
	public void printDog() {
		System.out.print(this);//表示当前的对象
	}
	
	public void fun(){
		this.printDog();//调用当前类的方法
	}

	@Override
	public String toString() {//重写Object中toString方法,前面Object类中讲解过
		return "Dog [name=" + name + ", age=" + age + "]";
	}
}

此外,this还能指向构造方法,对于构造方法的使用如下:

class Dog{
	private String name;
	private int age;
	
	public Dog(){}
	
	public Dog(String name,int age){
		this.name = name;//特指当前类中的属性
		this.age = age;
	}
	
	public Dog(String name){
		this(name, 2);//还能指向当前的构造方法,此语句必须放在构造方法首行
	}
	
	public void printDog() {
		System.out.print(this);//表示当前的对象
	}
	
	public void fun(){
		this.printDog();//调用当前类的方法
	}

	@Override
	public String toString() {//重写Object中toString方法,前面Object类中讲解过
		return "Dog [name=" + name + ", age=" + age + "]";
	}
}

我们可以看到

public Dog(String name){
this(name, 2);//还能指向当前的构造方法,此语句必须放在构造方法首行
}

这个方法实际上调用的是
public Dog(String name,int age){
this.name = name;//特指当前类中的属性
this.age = age;
}

这个构造方法。

需要注意的一点是:

如果使用了this来调用构造方法,则this的这条语句必须放在构造方法的首行。

下面是错误的写法:


讲到这边,基本知识都说完了,this关键字在开发的时候使用还是很频繁的,当然它的使用也很灵活,往往不知道指向的是哪里。。所以在使用的时候要特别注意的。。