今天去一家外企的面试题.....

首先问了我这么一段程序,让我写出它的输出,当然,这个没啥问题

// codes start
class base{//a base class

// constructor
public base(){
System.out.println("base class construct");
}
// perform
public void perform(){
System.out.println("base class perform");
}

}


class subbase extends base{// derive from base

// constructor
public subbase(){
System.out.println("sub class construct");
}
// perform
public void perform(){
System.out.println("sub class perform");
}

}

public class casting{// test casting class
// constructor
public casting(){
System.out.println("begin casting test");
}

public static void main(String args[]){
base father = new base();
subbase son = new subbase();

father = (base)son; // <1>
father.perform();

son = (subbase)father; // <2>
son.perform();

father = (base)((subbase)father); // <3>
father.perform();
}
}

// codes end

************************************************** *
and the execution result is:
// begin
base class construct
base class construct
sub class construct

sub class perform // <a>
sub class perform // <b>
sub class perform // <c>
// end

************************************************** **

然后就写了,然后他问为啥,俺就答啊,无非就是一个引用的问题嘛,他老人家还挺高兴,无奈笑里藏刀,马上又问了一个问题,
((base)new subbase()).perform();
这个语句没有啥引用了吧,你说说为啥也输出 sub class perform 啊?

我当时傻眼了,现在还傻呢

也是 new 关键字就是产生对象用的,莫非是java虚拟机内部的事情?

请诸位帮忙给个解答,然后我就找块最大的豆腐撞死算了.........

base father = new base();//引用father在栈中,它的对象在堆中,设它为对象F
subbase son = new subbase();//引用son在栈中,它的对象在堆中,设它为对象S

father = (base)son; //引用father指向对象S,对象F很有可能成了垃圾
father.perform();//调用的是对象S的perform()方法
son = (subbase)father; // son引用指向对象S,father引用也是指向对象S
son.perform();//当然也是调用对象S的perform()方法啦

father = (base)((subbase)father); //father引用指向对象S,转型只改变了引用类型
father.perform();//既然father还是指向对象S,当然也是调用对象S的方法啦。

((base)new subbase()).perform();这个不还是父类引用指向子类对象,调用当然是子类方法啊。它还是相当于
Subclass son = new Subclass();
Father f = (base)son;

>((base)new subbase()).perform();这个语句没有啥引用了吧

主要你们俩对引用的定义不一样,引用不是书写上的引用和使用,上面书写上虽然没有语法上引用,但是,只要访问一个对象的内部元素或方法,就必然需要引用它,那么语言必然使用指针或引用堆栈等技术细节来实现它。

从这个意义来看,这个试题毫无意义,很鄙视这种玩弄概念没有设计含义的考题,显示面试者水平的局限。

banq,你真狠啊!

问题已解决,去找大块豆腐去了.......

同时也感谢其他两位给的解答!

结贴!

今天上午已经收到该公司的offer.....

现实中的 程序要是这样转来转去的 ,那肯定是有问题啊 ,没有什么现实意义,我也 非常讨厌这样的题目

在校大学生,正面临着就业,这样的题没什么问题,只是还是有点郁闷……

其实对于招毕业生的职位来说,招聘考这种题也无可厚非。刚毕业的程序员能有多深的层次?能把这些搞明白,起码java上还是有一定基础的。没办法,中国企业大多这样,要直接能用的人,而不是有潜质但需慢慢培养的人。

这才是拼的硬功夫

看不明白。。。

这是一个上溯造型和下溯造型的问题,但这种问题有意思吗?咋不多问问对他们服务的行业了解些什么啊。

father = (base)son; // <1>
father.perform();


这里..把子类UP成父类..为什么输出还是子类的?应该是父类的吧..

之前贵公司面试也是面试一些这样的问题,为何面试的时候不和应聘人员交流交流,看法,对这个语言的了解,一来就要程式员式的写个代码,难道那个代码语句忘了,就不能查查资料吗?我觉得关键还是方法!!方法掌握了,就是代码忘了,查查资料,有什么不成的
很欣赏banq ,对OO的理解!

同学,这是最最基本的OO问题,多态

晕,我看了半天没看明白,啥子叫没啥引用?关引用什么事,那不就是一个向上向下转型嘛