A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

题目:如下代码,输出是什么?

  • import java.util.*;
  • class OverrideTest
  •     public static void f(Collection c){
  •         System.out.println("Collection");
  •     public static void f(List m){
  •         System.out.println("List");
  •     public static void f(Set m){
  •         System.out.println("Set");
  •     public static void main(String[] s){
  •         Collection[] c={new ArrayList(),new HashSet()};
  •         for(int i=0;i<c.length;i++)
  •             f(c);

面试时,想了一下,直接说
      很悲剧的错了,面试官细致的讲解了一下,然后豁然开朗。

解答(不要紧着看答案)
这里,主要考察的是重载机制:方法的重载是在编译时绑定。其中重载的方法f,形参Collection包含List,Set。在main方法中,c是Collection类型的数组,分别存放ArrayList和HashSet实例。而f(c)因为不像重写一样是动态绑定的,不会出现,当c是ArrayList实例时,f调用的是f(List)方法;当c是HashSet实例时,调用f(Set)方法。因为c是Collection类型数组,直接在编译时确定f应该指向f(Collection)方法,

所以运行结果是:

  • Collection  
  • Collection  






评分

参与人数 1黑马币 +6 收起 理由
Rancho_Gump + 6 赞一个!

查看全部评分

6 个回复

倒序浏览
李培根 来自手机 金牌黑马 2013-1-24 18:15:49
沙发
支持下,学习了。
回复 使用道具 举报
难道是:
List
Set
回复 使用道具 举报
值得学习,不错
回复 使用道具 举报
不知道楼主测试了没有,如果楼主代码没写错的话应该根本就通过编译吧


QQ截图20130124192412.png (43.54 KB, 下载次数: 24)

QQ截图20130124192412.png
回复 使用道具 举报
楼主只是示意  学习了
补个完整程序吧:
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class chongzai {
         public static void main(String[] s){
               Collection[] c={new ArrayList(),new HashSet()};
               for(int i=0;i<c.length;i++)
               { OverrideTest.f(c[i]);}
         }
}

class OverrideTest {   
        public static void f(Collection c){   
        System.out.println("Collection");
        }
        public static void f(List m){
       System.out.println("List");
    }
    public static void f(Set m){
        System.out.println("Set");
    }

}
回复 使用道具 举报
学习了...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马