`
tianlihu
  • 浏览: 314000 次
  • 性别: 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重载概念

    ### JAVA重载概念详解 #### 一、方法重载的概念 在 Java 编程语言中,方法重载(Method Overloading)是一种非常重要的特性,它允许我们在同一个类中定义多个同名但参数列表不同的方法。这种方法重载的概念是实现...

    Java重载.docx

    5. **编译器自动匹配**:在程序运行时,Java编译器会根据调用方法时传递的参数类型和数量来选择最适合的方法。如果有多于一个可能匹配的方法,编译器会选择最精确的匹配,即参数类型完全一致的那个。如果没有精确...

    Java重写重载线程

    当尝试调用`speak(5, 5)`时,由于存在两种可能的方法匹配方式(即,将两个整型参数分别映射到第一个方法的`double`和`int`参数,或者映射到第二个方法的`int`和`double`参数),Java编译器无法确定调用哪一个方法,...

    【Java编程教程】详解Java 重载.pdf

    当调用重载方法时,如果传递的参数类型不完全匹配,Java会进行类型提升。例如,较小的数据类型(如 byte, short, char)会被提升为较大的数据类型(如 int, long, float, double)。这是为了确保调用到合适的方法。...

    java面向对象重载和重写

    在Java中,重载(Overloading)指的是在同一个类中可以有多个同名的方法,但这些方法的参数列表必须不同,即参数的个数、类型或顺序至少有一个不相同。重载并不关心方法的返回类型,因为返回类型不能作为区分方法的...

    Java重写和重载概念及区别梳理

    在编程语言中,Java的重写(Override)和重载(Overload)是两个非常重要的概念,它们在类与对象的多态性中起到关键作用。理解并掌握这两个概念是成为一名合格的Java开发者的基础。 首先,我们来谈谈重写(Override...

    java方法的重载

    在Java中,如果一个方法的参数列表与实际调用时提供的参数不完全匹配,那么编译器会尝试进行自动类型转换来找到最佳匹配的方法。例如: ```java Example e = new Example(); e.show(1, 2, 3); // 调用 show(int a, ...

    JAVA中的方法重写与方法重载区别

    方法重写(Override)是指在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,这样可以重写父类的方法。在方法重写中,子类可以对父类的方法进行修改或扩充...

    Java方法重载详细说明

    - 在调用重载方法时,Java会根据传入的实际参数类型,按照“匹配最佳”原则来选择合适的方法进行调用,这称为“动态绑定”或“后期绑定”。 通过方法重载,我们可以编写更加简洁、易于理解的代码。在实际开发中,...

    Java 零基础方法重载.md

    在Java语言中,方法重载(Overloading)是一种允许在同一个类内定义多个同名方法的技术,但这些方法必须具有不同的参数列表(参数个数不同或参数类型不同)。这种特性极大地增强了程序的灵活性与可读性,使得开发...

    Java 程序显示类中方法的重载.docx

    Java 中的方法重载是指在同一个类中可以定义多个具有相同名称的方法,但是这些方法的参数列表不同,包括参数的数量、参数的数据类型、参数的顺序等。方法重载是 Java 中的一种多态性,它允许开发者编写更加灵活和...

    Java数据类型及其转换详解

    - 在多态方法调用中,如果存在多个重载方法,Java会选择与实参类型最匹配的那个。例如,如果有一个 `char` 变量 `y`,调用 `f(y)` 会匹配 `f(int)` 方法。 了解这些转换规则对于编写高效、无错误的 Java 代码至关...

    Java方法重载和方法重写的区别.docx

    Java编译器在编译期间通过匹配传入参数来确定调用哪个重载方法。这被称为静态绑定或早期绑定。以下是一个方法重载的例子: ```java public class OverloadTest { public static void main(String[] args) { sum()...

    Java方法继承、方法重载、方法覆盖总结

    4. **返回类型不同不是重载**: 方法的返回类型不同并不构成重载条件,因为Java编译器是根据方法签名(方法名+参数列表)来进行匹配的。 5. **构造函数也可以重载**: 构造函数同样可以被重载,这意味着一个类可以...

    java中方法的重载.doc

    这意味着当一个方法的参数类型与传入的实际参数类型不完全匹配时,如果存在兼容的类型转换,Java 会自动进行转换。例如: ```java class OverloadDemo { void test() { System.out.println("No parameters"); } ...

    JAVA数据类型转换.rar

    数据类型转换在方法参数匹配和多态调用中也起着关键作用。通过方法重载,可以根据传入参数的类型调用不同的实现。而方法重写时,子类方法覆盖父类方法,允许将子类对象作为父类对象处理,体现多态性。 10. **泛型...

    java单词java单词.doc

    * Overloaded method:重载方法,用于表示 Java 方法的重载。 * Overridden method:重写方法,用于表示 Java 方法的重写。 * Public:公有,用于表示 Java 成员变量或成员方法的访问权限。 * Private:私有,用于...

    JAVA方法覆盖与重载的区别.doc

    b) **参数列表必须相同**:子类方法的参数列表必须与父类方法完全匹配,包括参数数量和类型。 c) **返回类型必须相同**:子类覆盖的方法必须有与父类相同或兼容的返回类型。这是因为方法的签名(名称和参数列表)...

    Java高级编程理论课构造方法与方法重载PPT教案学习.pptx

    重载的方法在编译时由Java虚拟机(JVM)根据传入参数自动匹配合适的方法进行调用。值得注意的是,方法的返回类型并不能作为区分重载方法的标准,即两个方法即使返回类型不同,只要它们的参数列表相同,仍被认为是...

Global site tag (gtag.js) - Google Analytics