Chapter5_初始化与清理_方法重载
方法重载是java中编译器在方法调用时采用的一个重要机制。起初方法重载的初衷是方便构造器的调用,比如对于一个类,可以实现用不同的方法来初始化它,又由于构造器的名称都是一样的,所以必须使用到方法重载的机制,并且这种机制不仅限于构造器方法。下面这个例子提供了方法重载的构造器和一般方法的例子。
1 class tree{ 2 int height; 3 tree(){ 4 System.out.println("无参数构造器"); 5 } 6 7 tree(int height){ 8 this.height = height; 9 System.out.println("带参数构造器 " + height); 10 } 11 12 public void info(){ 13 System.out.println("height " + this.height); 14 } 15 16 public void info(int height){ 17 System.out.println("height " + height); 18 } 19 } 20 21 public class test { 22 public static void main(String[] args){ 23 tree t1 = new tree(); 24 tree t2 = new tree(10); 25 26 t1.info(10); 27 t2.info(); 28 } 29 }
输出如下:
1 无参数构造器 2 带参数构造器 10 3 height 10 4 height 10
上面的例子定义了两对重载的方法,分别是构造器方法和显示一些信息的一般方法,很容易看到,重载方法的区分规则很简单:每个重载方法都要有独一无二的参数类型列表,并且参数顺序不同的方法也可以进行区分。要注意的是,不同的是参数类型列表,这说明类型的顺序必须不同,如果类型顺序相同,仅仅是定义时的变量名不同,这样也是不行的。下面是一些演示。
1 class tree{ 2 int height; 3 tree(){ 4 System.out.println("无参数构造器"); 5 } 6 7 tree(int height){ 8 this.height = height; 9 System.out.println("带参数构造器 " + height); 10 } 11 12 public void info(String s, int height){ 13 System.out.println(s + height); 14 } 15 16 public void info(int height, String s){ 17 System.out.println(s + height); 18 } 19 20 /*public void info(int height, String s2){ 21 System.out.println(s2 + height); 22 } 23 报错!*/ 24 } 25 26 public class test { 27 public static void main(String[] args){ 28 tree t1 = new tree(); 29 tree t2 = new tree(10); 30 31 t1.info(10,"height "); 32 t1.info("height ", 10); 33 } 34 }
输出:
1 无参数构造器 2 带参数构造器 10 3 height 10 4 height 10
这很显然证明了之前的论述,重要的是对参数类型列表的理解。另外需要注意的是用返回值来区分重载方法是不可取的,编译器并未对这个机制提供实现,原因是在编程中,许多人会关注方法的内容,即它们完成了什么事情,而非关注方法的返回值,这被称为“为了副作用而副作用”。
另一个问题就是在方法重载过程中涉及到的类型转化的问题。如果被传入的数据类型小于方法声明中的参数类型,实际数据类型就会被提升,对于char型如果无法找到接受char型参数的方法,会被提升至int类型。如果方法接受的数据类型比参数列表中声明的小,会通过窄化转化来执行操作。