Java之this详解

1. this是指当前对象自己。

用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法,那们类里面是够也应该有一个引用来访问自己的属性和方法纳?呵呵,JAVA提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法。如下面这个例子中:

public class ThisDemo {
	String name = "Mick";

	public void print(String name) {
		System.out.println("类中的属性 name=" + this.name);
		System.out.println("局部传参的属性=" + name);
	}

	public static void main(String[] args) {
		ThisDemo tt = new ThisDemo();
		tt.print("Orson");
	}
}

2.使用this区分同名变量

成员变量与方法内部的变量重名时,希望在方法内部调用成员变量,怎么办呢?这时候只能使用this,例如:

public class Demo {
	public String name;
	public int age;

	public Demo(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public void say() {
		System.out.println(name + " " + age);
	}

	public static void main(String[] args) {
		Demo obj = new Demo("hdk1993", 21);
		obj.say();
	}
}

3.使用this调用构造函数

在构造函数中,通过this可以调用同一class中别的构造函数,如

public class Flower {
	Flower(int petals) {
	}

	Flower(String ss) {
	}

	Flower(int petals, Sting ss) {
		// petals++;调用另一个构造函数的语句必须在最起始的位置
		this(petals);
		// this(ss);会产生错误,因为在一个构造函数中只能调用一个构造函数
	}
}

值得注意的是:

(i):在构造调用另一个构造函数,调用动作必须置于最起始的位置。

(ii):不能在构造函数以外的任何函数内调用构造函数。

(iii):在一个构造函数内只能调用一个构造函数。

4.this作为函数返回值

关于返回类自身的引用,Thing in Java有个很经典的例子,通过this 这个关键字返回自身这个对象然后在一条语句里面实现多次的操作,还是贴出来。

public class ThisDemo {

	int number;

	ThisDemo increment() {

		number++;

		return this;

	}

	private void print() {

		System.out.println("number=" + number);

	}

	public static void main(String[] args) {

		ThisDemo tt = new ThisDemo();

		tt.increment().increment().increment().print();

	}

}

5.this作为参数传递

需要在某些完全分离的类中调用一个方法,并将当前对象的一个引用作为参数传递时。例如:

public class Demo {

	public static void main(String[] args) {

		B b = new B(new A());

	}

}

class A {

	public A() {

		new B(this).print(); // 匿名对象

	}

	public void print() {

		System.out.println("Hello from A!");

	}

}

class B {

	A a;

	public B(A a) {

		this.a = a;

	}

	public void print() {

		a.print();

		System.out.println("Hello from B!");

	}

}

运行结果:
Hello from A!
Hello from B!
在这个例子中,对象A的构造函数中,用new B(this)把对象A自己作为参数传递给了对象B的构造函数。
匿名对象就是没有名字的对象。如果对象只使用一次,就可以作为匿名对象,代码中 new B(this).print(); 等价于 ( new B(this) ).print();,先通过 new B(this) 创建一个没有名字的对象,再调用它的方法。

6. 注意匿名类和内部类中的中的this。
有时候,我们会用到一些内部类和匿名类,如事件处理。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如下面这个例子:

public class A {
	int i = 1;

	public A() {
		Thread thread = new Thread() {
			public void run() {
				for (;;) {
					A.this.run();
					try {
						sleep(1000);
					} catch (InterruptedException ie) {
					}

				}
			}
		}; // 注意这里有;
		thread.start();
	}

	public void run() {
		System.out.println("i = " + i);
		i++;
	}

	public static void main(String[] args) throws Exception {
		new A();
	}
}

clip_image009[1]

在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。

posted @ 2015-04-07 23:01  程序员修练之路  阅读(4906)  评论(0编辑  收藏  举报