从一道测试题分析java中的方法重载(overload)

原创 2004年06月23日 17:10:00

      本文旨在通过一道测试题目分析java语言中方法重载的机制,帮助读者更好的掌握java语言的基础知识。

      首先我们先看一道测试题目,源代码如下所示,你觉得程序能否通过编译呢,如果可以通过编译输出的结果会是什么呢?
//TestOverLoad.java
public class TestOverLoad
{
 public static void main(String[] args)
 {
  Test test = new Test();
  test.print(null);  
 } 
}

class Test
{

 public void print(String some)
 {
  System.out.println("String version print");
 } 
 
 public void print(Object some)
 {
  System.out.println("Object version print"); 
 }

}

答案是可以通过编译,输出的结果是String version print。不知道你猜测的是否准确是否知道其中的原理,这个题目明显是考察方法重载的,重载使得java的类可以有具有多个相同方法名的方法。编译器可以通过方法的参数的类型和个数来区分他们。而返回值和异常是不能作为区别标志的。上面的程序输出了String version print是遵循了方法重载中准确性的原则,null是作为一个很特别的参数传给了方法print(),因为你可以认为null是String,也可以认为null是Object。但是从层次上看Object处在更上层,String是从Object继承过来的,调用print(String some)将更准确。

      如果在TestOverLoad类中再添加一个方法如下所示,这样会如何呢?
public class TestOverLoad
{
 public static void main(String[] args)
 {
  Test test = new Test();
  test.print(null);  
 } 
}

class Test
{

 public void print(String some)
 {
  System.out.println("String version print");
 } 
 
 public void print(Object some)
 {
  System.out.println("Object version print"); 
 }
 
 public void print(StringBuffer some)
 {
  System.out.println("StringBuffer version print"); 
 }
}
答案是不能通过编译,为什么呢?由于StringBuffer和String并没有继承上的关系,因此编译器感觉StringBuffer和String作为参数的方法都很准确,它就不知道到时候会运行哪个方法了,因此会出现编译错误,这是方法重载中唯一性的原则。如果我们把参数null修改为"hello world",那么就可以通过编译并运行输出String version print了。

      曾经在java.sun.com上读文章看到一篇文章说方法的返回值也是区别方法的标志,其实这是错误的。看看下面的程序
public class A

 
 public  int aMethod(String s)
 {
  System.out.println(s);
  return 1; 
 }
 
 public  void aMethod(String s)
 {
  System.out.println(s); 
 }
}
编译的时候会提示aMethod(String s)方法已经定义过的错误。实践证明一切!

从一道测试题分析java中的方法重载(overload)

  • zgqtxwd
  • zgqtxwd
  • 2008年04月25日 18:48
  • 79

java中方法重写(Override)与方法重载(Overload)的区别

虽然知道方法重写与方法重载,但总是会忘记具体的区别以及一些细节,所以干脆就写一篇博客记录下来吧。 方法重写(Override):        在Java中,子类可继承父类中的方法,而不需要重新编写相...
  • BeauXie
  • BeauXie
  • 2016年10月31日 20:16
  • 1845

JAVA中的基础-----重载与重写(覆盖)的区别:overload与override

JAVA中多态的实现机制主要通过overload和override实现。 1)方法的重载:简言之,就是指同一个类有多个同名的方法,这些方法拥有不同的参数(同名不同参)。可以认为是类中方法的多态性,也称...
  • Emira_J
  • Emira_J
  • 2016年04月20日 10:21
  • 689

[java]静态方法overload重载

1. 方法重载(Overload)   静态的,编译期间决定调用哪个方法;   只与句柄的类型有关,而与对象的实际类型无关;2. 方法覆盖 (Override)   动态的,只能在运行期间才能决定调用...
  • eff888
  • eff888
  • 2008年02月29日 12:17
  • 626

静态方法overload重载

1. 方法重载(Overload)    静态的,编译期间决定调用哪个方法;    只与句柄的类型有关,而与对象的实际类型无关; 2. 方法覆盖 (Override)    动态的,只能在运行期间才能...
  • ycb1689
  • ycb1689
  • 2013年12月06日 10:56
  • 2256

Java中重载(Overload)和重写(Override)的区别

重载(Overload)重载是指在一个类里面,方法名相同,参数不同。java中有构造器重载和方法重载(意义是一样的,叫法不同)public class Car { private String...
  • u010958620
  • u010958620
  • 2016年03月27日 16:52
  • 1033

方法重写Override笔记及其与Overload(重载)的区别

方法重写概述及其应用 * A:什么是方法重写 * 重写:子父类出现了一模一样的方法(注意:返回值类型可以是子父类) * B:方法重写的应用: * 当子类需要父类的功能,而功能主体子类有自己...
  • uotail
  • uotail
  • 2017年05月03日 22:01
  • 83

方法重载overload与重写override的区别

重载Overload 重写Override 相同点 见下 见下 不同点 参数签名必须不一致 参数签名必须一致   不限制返回类型 返回类型必须一致 ...
  • SPENCER_HALE
  • SPENCER_HALE
  • 2017年03月22日 22:27
  • 106

今天学习了 override (重写 )和overload(重载)的区别

覆写(Override)的两个函数的函数特征相同 重载(Overload)的两个函数的函数名虽然相同,但函数特征不同。 函数特征包括函数名,参数的类型和个数。 Override 是在继承的时候,如果...
  • zhongyuangong521
  • zhongyuangong521
  • 2014年07月08日 17:04
  • 260

java中方法重载和方法重写分析

用简单的话来说方法重载(Overloading)就是在同一个类中,方法的名字相同,但参数个数、参数的类型或返回值类型不同,方法重写(Overriding)是指子类和父类的关系,子类重写了父类的方法,但...
  • lisansi9999
  • lisansi9999
  • 2016年05月25日 08:59
  • 515
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从一道测试题分析java中的方法重载(overload)
举报原因:
原因补充:

(最多只允许输入30个字)