如果有同一类型的两个对象,分别是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);
这是内部的表达形式。我们并不能这样书写代码,并试图通过编译;但这种写法的确能帮你了解实际所发生的事情。
-
假设你希望在方法的内部获得对当前对象的引用。由于这个引用是由编译器 “偷偷” 传入的,所以没有标识符可用。但是,为此有个专门的关键字:this。this关键字只能在方法内部使用,表示对 “调用方法的那个对象”的引用。this的用法和其他对象引用并无不同。
-
但要注意,如果在方法内部调用同一个类的另外一个方法,就不必使用this,直接调用即可。当前方法中的this引用会自动应用于同一个类中的其他方法。所以可以这样写代码:
public class Apricot{
void pick(){/*****/}
void pit(){ pick(); /******/}
}
- 在pit()内部,你可以写 this.pick(),但无此必要。(别闲的蛋疼).编译器能帮你自动添加。只有当前需要明确指出对当前对象的引用时,才需要使用 this 关键字。
- 如:当需要返回对当前对象的引用时就常常在 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(); //调用无参构造
指定对应构造参数时,就会调用对应的带参构造
- 注意点:
- 尽管可以用 this 调用构造器,但却不能调用两个。
- 此外,必须将构造器置于最起始处,否则编译器会报错。
- 除构造器外,编译器禁止在其它任何地方调用构造器。
2、static 修饰 ,粗略讲解一下
-
了解this关键字之后,就能更全面地理解 static (静态)方法的含义。
-
static方法就是没有 this 的方法。在 static 方法的内部不能(直接)调用非静态方法,反过来可以的。
-
而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用 static 方法。
-
总之用static修饰的成员就是属于类本身的你可以这么理解。