前几天被电话面试,问Java的参数传递方式,我说只有一种方式,就是by value啊,对方纠正我说,基本类型传值,对象类型传引用;呜呼,当时被噎了一下,几秒钟后回过神来,我明白他的意思,也明白我碰上新世纪的新新人类了,但我怕他不明白啊,就说我们还是先把“引用”这个概念定义清楚吧,不要同一个词两人有两个意思,或者举个例子吧,在函数里对String类型的参数赋值是不影响实际参数的啊,于是他也明白我其实也明白,电话面试就算过了
然而还不算完,正式面试的四轮:笔试题,笔试完后与leader谈,谈完后与manager谈,谈完后与VP谈,居然每一轮都有这道题!只不过换成了swap函数的形式,让你说出执行结果;我就纳了闷了,这道题在人们心目中的形象就那么高大?并且甲方答案也似是而非?
Bjarne一直认为是C++的教育害了C++,那么是什么害了Java语言呢?过度的商业宣传!
当然,商业宣传成功的帮助了Java平台,吸引了大量开发者,但对Java语言来说,先听到宣传词后再来学习的初学者,耳中充斥的是“Java取消了指针”,“Java没有内存泄露”,“Java纯面向对象”等宣传用语,先入为主的就接受了表面现象,而没有理解问题的实质
Java取消了指针?看看那个所谓的“引用”为空时抛出的异常吧,看看在Java实现者的眼中这个东西到底是啥吧:NullPointerException!不是我鄙视Sun,它的细节伪装的确实不如MS:.net里对应的异常叫NullReferenceException,虽然也是换汤不换药;作为一种类C语言,我认为对应概念的命名还是一致较好,Java里其实全是指针,你基本无法得到对象本身,只不过这种指针功能受限,不需删除而已
指针的概念被伪装起来,不需要delete了,那么除内存之外的其它资源呢?数数你的程序里有多少个finally就可以了
Java纯面向对象?其实就这句话本身来说也无可厚非,只是它使用了<<箭鱼行动>>里定义的“错误引导”,这句话会使初学者倾向于认为用Java写出来的程序都是面向对象的,从而阻碍了理解真正的面向对象;数数你程序里有多少根据对象类型的switch/if/else就可以了
题外话:
面试时被问道面向对象的三个基本特征,我知道他想听到什么封装继承多态,但实际上传统面向对象的核心特征就是多态,继承只是用来实现多态的一种手段,并非本质特征;C语言没有继承,但照样可以进行OO风格的编程。