快捷搜索: 王者荣耀 脱发

Java之路:this关键字的用法

(1)this代表当前对象的一个引用。所谓当前对象,指的是调用类中方法或属性的那个对象。

最经常使用this关键字的情况,是在对象的一个属性被方法或构造器的参数屏蔽时,需要调用这个被屏蔽的属性,如下:

class Person {
          
   
    private String name;
    private int age;
    public Person(String name, int age) {
          
   
    // 局部变量name,age把Person类的属性屏蔽
        this.name = name;
        this.age = age;
    }
}
(2)this只能在方法内部使用,表示对“调用方法的那个对象”的引用。但要注意,如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可。当前方法中的this引用会自动应用于同一类中的其他方法。

如下:

public class Apricot {
          
   
	void pick() {
          
   }
	void pit() {
          
   
		pick();
	}
}

在pit()内部,你可以写this.pick(),但无此必要。编译器能帮你自动添加。只有当需要明确指出对当前对象的引用时,才需要使用this关键字。

注:有些人执意将this放在每一个方法调用和字段引用前,认为这样“更清楚更明确”。但是造成别这样做。我们使用高级语言的原因之一就是它们能帮我们做一些事情。要是你把this放在一些没必要的地方,就会使读你程序的人不知所措,因为别人写的代码不会到处用到this。人们期望只在必要处使用this。遵循一种一致而直观的编程风格能节省时间和金钱。

(3)this不能用于静态方法。main方法也是静态的,所以this也不能用于main方法。

Static方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成,而this指代的是当前的对象。

在方法中定义使用的this关键字,它的值是当前对象的引用。也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.。

而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象。如果使用的是类来调用而不是对象,则this就无法指向合适的对象。所以static 修饰的方法中不能使用this。

(4)可以使用this关键字调用重载构造方法。避免相同的初始化代码,只能在构造方法中用,并且必须位于构造方法的第一句。并且,除了构造器之外,编译器禁止在其他任何方法中调用构造器。
package this_constructor;
class Person {
          
   
	String name;
	int age;
	public Person() {
          
   
		System.out.println("Person() constructor!");
	}
	public Person(String name, int age) {
          
   
		this();	// 调用本类中无参构造方法
		this.name = name;
		this.age = age;
		System.out.println("Person(String name, int age) constructor!");
	}
}
public class ThisConstructor {
          
   
	public static void main(String[] args) {
          
   
		{
          
   
			new Person("小光", 25);
		}
	}
}

【结果】

再看下例:

public class Rectangle {
          
   
	private int x, y;
	private int width, height;
	public Rectangle() {
          
   
		this(0, 0, 0, 0);	// 调用当前对象带有四个参数的构造器
	}
	public Rectangle(int width, int height) {
          
   
		this(0, 0, width, height);
	}
	public Rectangle(int x, int y, int width, int height) {
          
   
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
	}
	...
}
有的读者经常会有这样的疑问,如果我把this()调用无参构造方法的位置任意调换,那不就可以在任何时候都可以调用构造方法了么?实际上这样理解是错误的。构造方法是在实例化一个对象时被自动调用的,也就是说在类中的所有方法里,只有构造方法是被优先调用的,所以使用this调用构造方法必须也只能放在类中。
经验分享 程序员 微信小程序 职场和发展