`
rootjo
  • 浏览: 17414 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一道比较绕的面试题

阅读更多
朋友遇到的面试题,供大家拍砖
class Base{
void iam(Base b){
System.out.println("i am base base");
}
void iam(Child b){
System.out.println("i am base child");
}
}

class Child extends Base{
void iam(Base b){
System.out.println("i am child base");
}
void iam(Child b){
System.out.println("i am child child");
}
}

public class Test{
public static void main(String[] args) {
Base[] test = new Base[]{new Child(), new Child()};
for (int i = 0; i < test.length; i++) {
test[i].iam(test[i]);
}
}

}
分享到:
评论
4 楼 kjchen 2008-12-21  
对不起,用词不当:改为

其实做对这道题的必要条件是要理解JAVA数组声明和创建对象的语义。Base[] test = new Base[]{new Child(), new Child()}; 这条语句的意思是“声明一个名称为test,长度为2,元素类型为Base的数组,但实际向元素中赋的是Child类的对象”。这条语句等价于下面两条:
Base[] test = { new Child(), new Child() };

Base[] test = new Base[2]; (声明一个名称为test,长度为2,元素类型为Base的数组)
test[0] = new Child();(向元素中赋的是Child类的对象)
test[1] = new Child();(向元素中赋的是Child类的对象)
故下面的结果就顺理成章了:
test[0].iam(test[0])等价于Child.iam(child)
test[1].iam(test[1])等价于Child.iam(child)
所以输出
i am child base
i am child base
3 楼 kjchen 2008-12-21  
其实做对这道题的必要条件是要理解JAVA数组声明和创建对象的语义。Base[] test = new Base[]{new Child(), new Child()}; 这条语句的意思是“创建一个名称为test,长度为2,元素类型为Base的数组,但实际向元素中赋的是Child类的对象”。这条语句等价于下面两条:
Base[] test = { new Child(), new Child() };

Base[] test = new Base[2]; (创建一个名称为test,长度为2,元素类型为Base的数组)
test[0] = new Child();(向元素中赋的是Child类的对象)
test[1] = new Child();(向元素中赋的是Child类的对象)
故下面的结果就顺理成章了:
test[0].iam(test[0])等价于Child.iam(child)
test[1].iam(test[1])等价于Child.iam(child)
所以输出
i am child base
i am child base
2 楼 xieboxin 2008-12-20  
我觉得关键在于:

Base[] test = new Base[]{new Child(), new Child()};
 
这一句,因为Child 己向上转型为Base,所以,执行的是:

   
 void iam(Base b) {
		System.out.println("i am child base");
	}


因为new 的对象为Child,所以Override了父类的

 void iam(Base b) {
		System.out.println("i am child base");
	}



所以最终打印出来的是:

  i am child base
  i am child base
1 楼 tongfan 2008-12-20  
override, overload, covariance
诡异度较高的covariance.

Covariance means that the type of arguments, return values, or exceptions of overriding methods can be subtypes of the original types.
Java
Exception covariance has been supported since the introduction of the language. Return type covariance is implemented in the Java programming language version J2SE 5.0. Parameter types have to be exactly the same (invariant) for method overriding, otherwise the method is overloaded with a parallel definition instead.
编译器根据参数类型进行猜测。猜得到,它就猜。猜不到,它就让你编译不过。
上面的,编译器能猜得到。
编译器才不管你运行的时候,真正的类型是什么。
它只按字面意思理解。你定义的参数,对应的变量是什么类型。它就选什么类型。如果两个类型都匹配,那么就猜更具体的类型。
如果都猜不到,那么就让你编译不过,说你是 含糊不清,二义性,ambiguous

相关推荐

    大唐电信笔试面试题(含部分参考答案)

    【大唐电信笔试面试题解析】 1. 数列问题:这是一个等差数列,每次增加4,所以6后的数字依次为10,18,32,46。 2. 买卖计算:这是一道简单的计算题,通过计算买进卖出的价格差得知,这桩买卖盈利20元。 3. 月球绕...

    高级开发人员面试宝典之醉人的智力测试题.docx

    这是一道逻辑推理题。打开第一个开关,等待一段时间后关闭,然后打开第二个开关,立即进入房间。如果灯是亮的,那么对应的是第二个开关;如果是冷的,那么是第一个开关;如果灯是热的但不亮,那么对应的是第三个开关...

    滴滴快校园招聘网上测试题.docx

    3. 第三题:这是一道计算题。甲店的进货价是乙店的90%,乙店进货价200元,所以甲店进货价180元。甲店利润20%,乙店利润10%,所以甲店售价216元,乙店售价220元。甲店比乙店低4元。 4. 第四题:这题与前两题类似,...

    图解数据结构与算法

    2、实战2020大厂算法面试题:解析大厂算法面试题,分析其中算法原理,并动手实操,让大家通关面试最后一道题。 3、全面、系统化的课程设计:系统化讲解数据结构与算法,让你快速梳理整个算法知识体系,掌握算法的...

    微软笔试 软件工程 C语言

    - **解答:** 这是一道典型的逻辑思维题。首先,我们需要理解题目中的条件:假设每根绳子燃烧的时间相同,即每根绳子需要30分钟才能完全燃烧完毕。接下来,按照题目提供的步骤: 1. 同时点燃三根绳子中的任意两根的...

Global site tag (gtag.js) - Google Analytics