Java中的this关键字_解惑篇

如果有同一类型的两个对象,分别是a和b。你可能想知道,如何才能让这两个对象都能调用 peel() 方法呢:


class Banana{void peel(int i){/******/} }

public class Test {
	public static void main(String[] args)  {
		
		Banana a = new Banana();
		Banana b = new Banana();
		
		a.peel(1);
		b.peel(2);
		
	}
}
  • 如果只有一个peel() 方法,它如何知道是被 a还是被b所调用的呢?
  • 为了能用简便、面向对象的语法来编写代码—即 “发消息给对象”,编译器做了一些幕后工作。它暗自把“所操作对象的引用”作为第一个参数传递给 peel()。所以上述两个方法的调用就成了这样:
“发消息给对象” 例:
例如,假设有一个方法f(),不带参数,返回值类型是int。如果有个名为a的对象,可以
通过它调用f(),那么就可以这样写:
int x = a.f();
返回值的类型要与 x 的类型兼容
	这种调用方法的行为通常被称为发消息给对象。上列例子中:
		消息是 f(),对象是 a。
面向对象的程序设计通常简单地归纳为 “向对象发送消息”。
Banana.peel(a, 1);
Banana.peel(b, 2);

这是内部的表达形式。我们并不能这样书写代码,并试图通过编译;但这种写法的确能帮你了解实际所发生的事情。

  • 假设你希望在方法的内部获得对当前对象的引用。由于这个引用是由编译器 “偷偷” 传入的,所以没有标识符可用。但是,为此有个专门的关键字:thisthis关键字只能在方法内部使用表示对 “调用方法的那个对象”的引用。this的用法和其他对象引用并无不同。

  • 但要注意,如果在方法内部调用同一个类的另外一个方法,就不必使用this,直接调用即可。当前方法中的this引用会自动应用于同一个类中的其他方法。所以可以这样写代码:

public class Apricot{
	void pick(){/*****/}
	void pit(){ pick(); /******/}
}
  • 在pit()内部,你可以写 this.pick(),但无此必要。(别闲的蛋疼).编译器能帮你自动添加只有当前需要明确指出对当前对象的引用时,才需要使用 this 关键字
  1. 如:当需要返回对当前对象的引用时就常常在 return 语句里这样写:
public class Leaf {
	int i = 0;
	Leaf increment() {
		i++;
		return this;
	}
}
  • 补充:同上 方法内部调用同一个类的另外一个方法,如果调用的是类方法,也无须指出 “调用者”是谁,编译器会自动把类名作为“调用者” 类名.方法()形式

2.还有一种情况也需要明确指出“调用者”:

  • 类里的成员变量名和方法里的参数名一样时,想要在这个方法里用实例变量或类变量,就必须指出“调用者”是 this还是,如不指定,在方法中始终调用的是方法参数的那个变量。例如:

class A{	
	int num; //实例变量	
	static int num2; //类变量
	//带参构造
	public A(int num, int num2){
		// num = num; 
		this.num = num;
		//num2 = num2;
		A.num2 = num2;
	}	
}

如果你的意图是想把 方法中变量num或num2 赋值给实例变量或类变量就需要明确指出“调用者”,不然编译器是无法知道你想这么干的,你自己也不知道自己的意图。

关于“调用者”参考

1、关于构造器中调用构造器,
  • 可能为一个类写了多个构造器,有时可能想在一个构造器中调用另外一个构造器,以避免重复代码。可用 this 关键字做到这一点。
  • 通常写 this 的时候,都是指 “这个对象” 或者 “当前对象”,而且它本身表示对当前对象的引用。在构造器中,如果为 this 添加了参数列表,那么就有了不同的含义。这将产生对符合此参数列表的某个构造器的明确调用;这样,调用其他构造器就有了直接的途径:
例如: this(); //调用无参构造
		指定对应构造参数时,就会调用对应的带参构造
  • 注意点:
  1. 尽管可以用 this 调用构造器,但却不能调用两个。
  2. 此外,必须将构造器置于最起始处,否则编译器会报错。
  3. 除构造器外,编译器禁止在其它任何地方调用构造器。
2、static 修饰 ,粗略讲解一下
  • 了解this关键字之后,就能更全面地理解 static (静态)方法的含义。

  • static方法就是没有 this 的方法。在 static 方法的内部不能(直接)调用非静态方法,反过来可以的。

  • 而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用 static 方法。

  • 总之用static修饰的成员就是属于类本身的你可以这么理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值