首页 > 代码库 > Chapter5_初始化与清理_方法重载

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类型。如果方法接受的数据类型比参数列表中声明的小,会通过窄化转化来执行操作。

Chapter5_初始化与清理_方法重载