`
tianlihu
  • 浏览: 311890 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

Java的重载的类型匹配

阅读更多
本文版权归作者所有,仅供用来网上学习来用,读者可以收藏,请不要下载到本机和重新发布到其它网站

   在Java 中,同一个类中的2个或2个以上的方法可以有同一个名字,只要它们的参数声明不同即可。在这种情况下,该方法就被称为重载(overloaded ),这个过程称为方法重载(method overloading )。
   这篇文章不是为了讲什么是重载,怎么重载,而是为了举例重载时的一种特殊情况。
   上面也说了,重载是方法名同,而参数的声明不同。参数的声明不同不包括参数名不同,而是参数的类型不同。下面给出几种正确的方法重载的例子:
public class OverloadEx {

	public static void test() {
		System.out.println("test()");
	}

	public static void test(String arg) {
		System.out.println("test(String)");
	}

	public static void test(String arg0, int arg1) {
		System.out.println("test(String, int)");
	}

	public static void test(String arg0, Integer arg1) {
		System.out.println("test(String, Integer)");
	}

	public static void test(int arg0, String arg1) {
		System.out.println("test(int, String)");
	}

	public static void test(Integer arg0, String arg1) {
		System.out.println("test(Integer, String)");
	}
}

    从上面的代码可以看出,这几个test方法名称不用说都是相同的,但参数列表不同。前三个test方法的重载是因为参数的个数不同。第三个和第四个test方法,第五个和第六个test方法是因为参数的类型不同。而第三个和第五个,第四个和第六个是因为参数的位置不同。因些参数声明不同包括参数的个数,参数的类型,参数的顺序,但不包括参数名不同。像下面这种形式是错误的,不仅不是重载,连编译也不会通过,因为这两个方法其实是同一个方法。
public static void test(String arg00, int arg01);

public static void test(String arg10, int arg11);

   我们来看第一个方法执行的结果,首先我们写一个main方法来做个测试,分别调用这几个方法。有一点说明,测试是基于JRE5.0以后的版本。这时,由于JRE支持int和Integer类型的自动转换,这样的重载很容易出BUG。

    在写这个测试方法之前,我们先看一个关于基本数据类型和其封装类自动转换的例子,这一内容会在后面的文章中专门写。
public class AutoTypeTrans {

	public static void main(String[] args) {
		int i0 = 0;
		Integer i1 = 1;
		Integer i2 = new Integer(2);

		test(i0);
		test(i1);
		test(i2);
	}

	public static void test(Integer integer) {
		System.out.println(integer);
	}
}

结果是:
    0
    1
    2

    从结果上看,当程序执行到第8行时,发现i0为int类型,而方法的参数需要的是Integer类型,JVM会把i0自动转换成Integer,然后执行test(Integer)方法。

    看完上面的自动类型转换的小例子,再看第一个例子的测试方法
public static void main(String[] args) {
	int i = 10;
	Integer integer = i;
	String s = "test";

	test();
	test(s);
	test(s, i);
	test(s, integer);
	test(i, s);
	test(integer, s);
}

    程序执行的结果是:
    test()
    test(String)
    test(String, int)
    test(String, Integer)
    test(int, String)
    test(Integer, String)

    很明显,JRE会按照最精确匹配上的方法执行。JVM在执行过程中,会首先去匹配最精确匹配的方法,如果不能找,则寻找可进行自动类型转换后能匹配上的方法。
     这个过程如果程序员不注意的话,很容易出现错误,尤其是有继承关系的时候,重载父类的方法容易出错,到时只好DEBUG来查了。
     再看一下之方面的例子:
public class InheritOverload {
	public static void main(String[] args) {
		int i = 0;
		Integer integer = new Integer(1);
		String s = "2";
		Object obj1 = integer;
		Object obj2 = 4;

		Sub sub = new Sub();
		sub.test(i);
		sub.test(integer);
		sub.test(s);
		sub.test(obj1);
		sub.test(obj2);
	}
}

class Base {

	public void test(int arg) {
		System.out.println("test(int)");
	}

	public void test(Object arg) {
		System.out.println("test(Object)");
	}
}

class Sub extends Base {

	public void test(Integer arg) {
		System.out.println("test(Integer)");
	}

	public void test(String arg) {
		System.out.println("test(String)");
	}
}

    结果是:
    test(int)
    test(Integer)
    test(String)
    test(Object)
    test(Object)

    程序的第13行和第14行值得注意,obj1和obj2显然是Integer类型的,但是引用类型却是Object类型,JVM不会因为对象的真实类型是Integer类型,而去选择执行test(Integer),而是根据其引用类型Object选择了test(Object)。因为引用类型的自动转换只能从子类向其父类或父接口转换。
    像这样继承结构比较复杂的系统中,注意重载时的参数的类型自动转换,不然很容易会出现意想不到的结果。
0
0
分享到:
评论

相关推荐

    Java实验1 Java语言程序设计基础训练.doc

    通过本次实验,我们可以熟悉Java程序结构,掌握基本数据类型的使用方法,熟练运用分支、循环等语句控制程序流程,掌握方法、重载方法的定义和使用,掌握数组的使用方法,还可以掌握在JDK环境中编译和运行Java程序的...

    Java开发技术大全(500个源代码).

    testOverload_3.java 测试方法的重载示例4 useConstructor.java 使用构造器 useHideMember_2.java 试图使用隐藏的成员变量 useInner.java 使用内部类 第5章 示例描述:本章学习数组与字符串。 ArrayString....

    Java1.5泛型指南中文版(Java1.5Gene....pdf

    9. More fun with *:通配符匹配(wildcard capture)可以用来实现泛型的类型安全。 10. 泛型化老代码:可以将老代码泛型化,以提高代码的类型安全和可读性。 11.致谢:感谢 Java 1.5 泛型指南中文版的作者和翻译...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 7.6.3 发生了什么 174 7.7 加餐:局部变量和实例变量 175 7.7.1 ...

    浙工商java试卷

    在 Java 中,赋值语句的类型必须匹配。例如,short 类型不能直接赋值给 long 类型,需要进行强制类型转换。 9. 方法重载 在 Java 中,方法可以被重载,即多个方法可以具有相同的名称,但参数列表不同。这种机制...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 7.6.3 发生了什么 174 7.7 加餐:局部变量和实例变量 175 7.7.1 ...

    java面试题

    这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。 override可以翻译为覆盖,从字面就可以知道,它是...

    JAVA面试题最全集

    1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出...

    AIC的Java课程1-6章

     理解正则表达式,学会使用String.matches方法,Pattern和Matcher类进行模式匹配。  学会使用String.split方法,Scanner类,StringTokenizer类分解字符串。  [*]利用Formatter类的printf或format...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...

    java 面试题 总结

    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byte...

    常用JAVA面试题大全

    如果抛出一个异常,那么相匹配的catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize —方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理...

    java范例开发大全源代码

     实例37 数组元素类型不匹配异常(ArrayStoreException) 56  实例38 强制类型转换异常(ClassCastException) 56  实例39 索引越界异常(IndexOutOfBoundsException) 57  实例40 空指针异常...

    java范例开发大全

    实例37 数组元素类型不匹配异常(ArrayStoreException) 56 实例38 强制类型转换异常(ClassCastException) 56 实例39 索引越界异常(IndexOutOfBoundsException) 57 实例40 空指针异常(NullPointerException) ...

    Java范例开发大全 (源程序)

     实例37 数组元素类型不匹配异常(ArrayStoreException) 56  实例38 强制类型转换异常(ClassCastException) 56  实例39 索引越界异常(IndexOutOfBoundsException) 57  实例40 空指针异常...

    java常用工具类的使用

    A java.util.Date类型表示的是GMT时间,本身输出是国际化输出,由于中国处于东八区时间,因此输出结果是早上8点。而Date的其他构造方法和普通方法的API都不容易实现国际化,因此目前Date类的大多数方法都被标识为...

    21天学会java开发网络游戏

    如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理...

    Java面试题及答案(面试题集锦)

    如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。  finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的...

    java范例开发大全(pdf&源码)

    实例37 数组元素类型不匹配异常(ArrayStoreException) 56 实例38 强制类型转换异常(ClassCastException) 56 实例39 索引越界异常(IndexOutOfBoundsException) 57 实例40 空指针异常(NullPointerException) ...

Global site tag (gtag.js) - Google Analytics