当前访客身份:游客 [ 登录  | 注册加入尚学堂]
启用新域名sxt.cn
新闻资讯

this 关键字

Gabriel 发表于 2年前  | 评论(1 )| 阅读次数(532 )|   1 人收藏此文章,   我要收藏
摘要 this 关键字

一、this是怎样的关键字

    当有d1和d2两个对象时,如何同时调用一个方法?  

public class Dog {

	void bark(int i){
		System.out.println("Dog bark"+i+"times");
	}

}

public class DogBark {

	public static void main(String[] args) {
		Dog d1 = new Dog();
		Dog d2 = new Dog();
		
		d1.bark(1);
		d2.bark(2);

	}

}

     只有一个bark()方法,它如何知道是d1还是d2调用它呢?

    为了实现面向对象的语法编程,即“发送消息给对象”,实际上编译器在执行的时候把“对对象的引用”

作为第一个参数传给了bark()。上面方法在调用时实际变为:    

		Dog.bark(d1, 1);
		Dog.bark(d2, 2);

    这是编译器内部做的事,我们当然不会这么写代码。如果我们想在方法内部获得对当前对象的引用,

由于这个引用是由编译器传入的,并没有可用的标示符。为此就有了this关键字,来实现对“调用方法的那

个对象”的引用。但如果需要在方法内部调用同一个类的另一个方法,就不用使用this,直接调用即可。

二、this用法

   1.系统自动添加的this   

public class Ball {
	void hit() {

	}

	void play() {
		hit();
	}
}

    play()内部可以写成this.hit(),但是可以省略,因为编译器已经帮我们添加。除非特别指明对当前

对象的引用,才需要适用this关键字。

    2.return语句中的this

    例如需要返回当前对象的引用时,就需要在rerun语句中加入this:

public class Page {
	int i = 0;

	Page Increment() {
		i++;
		return this;
	}

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

	public static void main(String[] args) {
		Page p = new Page();
		p.Increment().Increment().Increment().print();

	}

}

    由于Increment通过this关键字返回了对当前对象的引用,可以方便的实现一条语句中对对象的多次

操作。

    3.方法间传递对象    

public class Person {
	public void eat(Dumpling dumpling) {
		Dumpling cooked = dumpling.getCooked();
		System.out.println("It's delicious!");
	}
}

public class Cooker {
	static Dumpling cook(Dumpling dumpling) {
		return dumpling;
	}

}

public class Dumpling {
	Dumpling getCooked() {
		return Cooker.cook(this);
	}
}

public class PassingThis {
	public static void main(String[] args) {
		new Person().eat(new Dumpling());
	}

}

    Dumpling要调用Cooker.cook()方法,它是一个外部的工具方法,执行操作只能在Dumpling之外

操作。为了将自身传递给外部方法,Dumpling只能使用this方法。

    4.在构造器中调用构造器

    有时候一个类中有多个构造器,构造器间实现调用,就需要用到this。    


public class Flower {
	int petalCount = 0;
	String s = "initial value";

	Flower(int petals) {
		petalCount = petals;
		System.out.print("Constructor w/int arg only,petalCoun t=.."
				+ petalCount);
	}

	Flower(String ss) {
		System.out.print("Constructor w/String arg only,s=" + ss);
		s = ss;
	}

	Flower(String s, int petals) {
		this(petals);
		// !this(s); // Can't call two!
		this.s = s; // Another use of"this"
		System.out.print("String&int args");
	}

	Flower() {
		this("hi", 47);
		System.out.print("default constructor(no args)");
	}

	void printPetalCount() {

		// !this(11); // Not inside non-constructor!
		System.out.print("petalCount=" + petalCount + "s=" + s);
	}

	public static void main(String[] args) {
		Flower x = new Flower();
		x.printPetalCount();
	}
}

    构造器Flower(Strings,int petal)表明:可以用this调用一个构造器,但不可以调用两个,而且构

造器必须放置在起始位置,否则编译器会报错。

    5.避免参数和成员变量重名

    上面例子中同时还有this的另一种用法,参数s和成员变量s重名,用this.s来表示成员变量就可以避免

发生歧义。这也是this最常用的用法之一。

    6.static没有this!   

    除此之外,还有一点值得记住,就是static方法中无法使用this关键字,这也成为static方法的一个

标志。Static方法由于不存在this,无法实现“向对象发送消息”,也被一些人称为“非面向对象”的。到底

是不是这样,还请读者来评判吧!




    





分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183