字节流的博客

Java 编程思想 - 初始化和清除

1. 方法重载

像很多语言中都有方法的重载一样,在 Java 中,通过同名方法,但是不同的参数列表来实现,即:每个重载的方法都有一个独一无二的自变量类型列表。也就是说重载方法的方法签名是不同的。

那么方法签名是什么?
通常,方法声明有六部分,依次为:

  1. 修饰符
  2. 返回值类型
  3. 方法名
  4. 参数列表
  5. 异常列表
  6. 方法体

定义:一个方法的方法名和参数列表即方法的签名。

如:

1
2
3
4
public double calculateAnswer(double wingSpan, int numberOfEngines,
double length, double grossTons) {
//do the calculation here
}

的方法签名即:calculateAnswer(double, int, double, double)

为什么不用返回值重载?
比如下面三个方法:

1
2
3
void fun();
int fun();
long fun();

如果编译器可以根据语境来判定执行哪一个方法的话,那么当要执行 int i = fun(); 时,我们很容易判断出,调用的是第二个重载方法。但是,当我们执行单独调用 fun() 的时候,不考虑方法的返回类型,这个时候,我们就无法辨别出到底要调用哪个方法。(想想构造方法,也是没有返回值类型的吧,也可以重载吧?)并且如果采用方法返回值类型重载,也不利于代码的阅读。

2. this 关键词

在 Java 中,this 关键词表示对象本身,即当你初始化完成一个对象的时候,this 就是这个对象的句柄。
如:

1
2
3
4
5
6
7
8
9
10
11
class Cat {
void f(int i) {
// do something...
}
}

// call
Cat a = new Cat();
Cat b = new Cat();
a.f(1);
b.f(2)

当调用方 f() 时,怎么确定是 a 还是 b 调用呢?
为了简便、面向对象的方法来写代码——亦即“将消息发送给对象”,编译器在背后作了一些幕后工作。编译器会把方法的第一个自变量设置为准备操作这个方法的那个对象的句柄。所以,上面的方法调用会变成如下形式:

1
2
Cat.f(a, 1);
Cat.f(b, 2);

Thanks! 😊