引言:

     D四、java构造器进行初始化中我们提到了方法的重载。在C语言中我们规定的函数名是独一无二的,而java(c++)中因为有了构造器的存在,为了实现用多种方法初始化对象,我们必须要对构造器进行重载,对方法进行重载。下面我们看一个例子:

class cat{
		int height;
		cat(){
			System.out.println("Raising a cat");
			height = 0;
		}
		cat(int i){
			height = i;
			System.out.println("The cat is "+height+" m");
		}
		void info() {
			System.out.println("There is "+height+" m");
		}
		void info(String s) {
			System.out.println(s+" is "+height+" m");
		}
	}
	public class OverLoading{
		public static void main(String []args) {
			for(int i=0;i<2;i++) {
				cat c = new cat(i);
				c.info();
				c.info("cat");
			}
			new cat();
		}
	}

     输出:

java方法重构的例子 java方法的重载 编程题_构造器

     上面你会发现,我重载了构造器,也重载了类里面的方法。编译器可以很容易的辨认出我需要初始化调用的是哪一个方法,也可以很轻易的知道需要调用类里面的哪一个方法。那么是如何辨别的呢?所以接下来我们就需要知道如何区分重载的方法

 

区分重载方法

     c++中区分重载方法是靠参数列表返回值来区分的,其实java也是这样的。上面的列子中,info()方法和info(String s)方法就是通过参数列表来区分,我们可以通过参数数据类型,参数顺序来区分,这些都是很好理解的。这里我们不会去讨论这个大家都很熟悉的问题,我要说的是基本类型的重载。基本类型能从一个较小的类型提升到一个较大的类型,但是涉及到重载就会有一些不一样。

比如下面这个例子:

class cat{
		void info(int i) {
			System.out.println("int");
		}
		void info(double i) {
			System.out.println("double");
		}
	}
	public class OverLoading{
		public static void main(String []args) {
			cat c = new cat();
			c.info(3);
			c.info(4.5);
			c.info('a');//char类型转换int     实际<列表参数
		}
	}

输出:     int       double       int

 

     上面的例子中,我们传给方法的实际参数会依次的对应方法进行调用,当我们传递的实际参数比列表参数类型小的时候,就会将实际参数提升。例如上面中将char类型的数据直接提升到int型。那么如果是实际参数大于列表参数呢???看下面例子:

class cat{
		void info(char c) {
			System.out.println("char");
		}
		void info(byte c) {
			System.out.println("byte");
		}
	}
	public class OverLoading{
		public static void main(String []args) {
			cat c = new cat();
			c.info('a');
			//c.info(3);   
            //编译器会报错:The method info(char) in the type cat is not applicable 
            //for the arguments (int)
			c.info((byte)3);
		}
	}

输出:     char        byte

 

     所以我们可以看出,当实际参数比列表参数类型大时,必须要进行类型转换,否则编译器就会报错。在引言那里我们提到了还可以通过返回值来区分重载方法(只是个玩笑,我们是不可能通过返回值来区分重载方法的,java编译器不知道要调用哪一个)。

 

后记:

    虽然你知道了区分调用重载方法,但是当有两个对象A,B(同一个类),要怎么去调用区别里面的方法呢?这就需要下一节讲解了,如有误,请指出,谢谢。