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();
	}
}

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

时间: 2024-10-07 01:56:54

Java之this详解的相关文章

java移位运算符详解[转]

java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位,0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. 2)运算规则 按

java 代理模式详解

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明白可过段时间又不能很流利的说出来,今天就用详细的比喻和实例来加深自己的理解(小弟水平不高有不对的地方希望大家能指出来). (1)代理这个词生活中有很多比如在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的.再比如我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothesInte

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

java内存泄露详解

很多人有疑问,java有很好的垃圾回收机制,怎么会有内存泄露?其实是有的,那么何为内存泄露?在Java中所谓内存泄露就是指在程序运行的过程中产生了一些对象,当不需要这些对象时,他们却没有被垃圾回收掉,而且程序运行中很难发现这个对象,它始终占据着内存却没有发挥作用. 我举这样一个例子,在现实开发中我们需要自定义一个先进后出的栈集合,代码如下: 这个代码看起来和运行起来都没问题,但是,这里有个很隐晦的问题,就是在pop()方法里面,我们首先找到集合最后一个元素的下标,然后按照下标从集合中取出,但是这

java移位运算符详解

java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移).1.左移运算符左移运算符<<使指定值的所有位都左移规定的次数.1)它的通用格式如下所示:value << numnum 指定要移位值value 移动的位数.左移的规则只记住一点:丢弃最高位,0补最低位如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. 2)运算规则按二进制形式把所有的

Java关键字synchronized详解

Java关键字synchronized详解 博客分类: Java综合 Java多线程thread互联网制造 synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法: 通过在方法声明中

转:Java HashMap实现详解

Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 2.    HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造

Java网络编程详解

Java网络编程详解 http://blog.csdn.net/he90227/article/details/39184247 Java网络编程详解

Eclipse Java Build Path详解

Eclipse Java Build Path详解 1.设置"source folder"与"output folder". * source folder:存放.java源文件的根目录;    * output folder:.class编译输出的根目录:    * 纯“java project”中,一般把"src"设置为source folder,把bin设置为output folder:    * 在“web project”中,一般把&q

Java反射机制详解

Java反射机制详解 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. 1.关于Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性    2.对象照镜子后(反射)可以得到的信息:某个类的数据成员名.方法和构造器.某个类到底实现