论坛首页 编程语言技术论坛

围观某公司的Java面试题,多态方法调用

浏览 16419 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-01-08  
tiange 写道
kidneyball 写道
这道题考的是最基本的封装。实际场景就是,你在子类里定义了一个私有变量,它与父类的私有变量重名。这太常见了。这道题就是考你是否知道私有变量是绝对隔离的。如果你以为是20,20,那么在阅读代码时就无法确认一个私有变量不可能在外部(包括子类)修改。进而可以看出,你没有通过阅读代码推演程序逻辑的习惯(如果你不能确定私有变量的作用域是当前类,阅读代码进行推演的难度会很大)。


你试过么,不要瞎说误导人,将父类和子类的全局变量都改为public,打印的也是10,跟私有半点关系没有。
说的在理,不过语气太重了。主要考虑的是field的静态绑定和method的动态绑定。
0 请登录后投票
   发表时间:2014-01-08   最后修改:2014-01-08
tiange 写道
kidneyball 写道
这道题考的是最基本的封装。实际场景就是,你在子类里定义了一个私有变量,它与父类的私有变量重名。这太常见了。这道题就是考你是否知道私有变量是绝对隔离的。如果你以为是20,20,那么在阅读代码时就无法确认一个私有变量不可能在外部(包括子类)修改。进而可以看出,你没有通过阅读代码推演程序逻辑的习惯(如果你不能确定私有变量的作用域是当前类,阅读代码进行推演的难度会很大)。


你试过么,不要瞎说误导人,将父类和子类的全局变量都改为public,打印的也是10,跟私有半点关系没有。


试啥,就算我真的不知道,看楼上的讨论也知道了。但首先题目里根本就没有出现public,其次楼主在问这道题究竟在考什么,你们扯到public变量上跟这道面试题或者跟楼主的问题有半点关系么。Java是静态语言,对变量的引用是在编译期静态绑定的,自然只会绑定当前类的变量上(如果当前类没有定义这个变量,则试图绑定离当前类最接近的父类变量)。问题这只是java的实现方式,在面向对象理论中,没有明确说public的变量不能被子类覆盖。假如出现一种语言,它的public变量就是可以被覆盖,你也不能说它错。所以,如果题目中出现了public变量的覆盖问题,我倒真的会鄙视题目,不常用的语言特性有什么好考。你们是自己把题目的考点曲解为“在java中对象变量能否动态绑定”,然后自己反驳“考这个有什么意思”,自己立个靶子自己推,不亦乐乎。

就这道问题本身来看,你根本不需要知道java的具体实现,或者去试。只要有一点面向对象理论知识,知道“封装”的意图,就能轻易推断出不应该允许子类覆盖父类的private变量,否则你在写父类代码时,根本无法确认所使用的私有变量会不会被外部直接修改,还要封装干什么用。同样为了保证子类不会意外覆盖父类的私有变量,你在使用任何框架,继承出子类的时候就应该检查所有的祖先类避免重名,而事实上根本没人会这样做。所以如果我是面试官,这道题属于最基础的送分题,如果这都出错,我会认为这位考生第一不理解面向对象中的封装,第二没有在团队中工作的经验(正如楼主所说,“我写的父类如何如何,又怎么会在子类中如何如何”,而现实情况大部分是父类跟子类根本不是由同一个人在同一段时间中写的)。
0 请登录后投票
   发表时间:2014-01-08  
你说的太对了, 我总结说一句话:变量静态绑定,实例方法动态绑定,你这里非常清晰的描述出来这么设计的道理所在。相当支持!
kidneyball 写道
tiange 写道
kidneyball 写道
这道题考的是最基本的封装。实际场景就是,你在子类里定义了一个私有变量,它与父类的私有变量重名。这太常见了。这道题就是考你是否知道私有变量是绝对隔离的。如果你以为是20,20,那么在阅读代码时就无法确认一个私有变量不可能在外部(包括子类)修改。进而可以看出,你没有通过阅读代码推演程序逻辑的习惯(如果你不能确定私有变量的作用域是当前类,阅读代码进行推演的难度会很大)。


你试过么,不要瞎说误导人,将父类和子类的全局变量都改为public,打印的也是10,跟私有半点关系没有。


试啥,就算我真的不知道,看楼上的讨论也知道了。但首先题目里根本就没有出现public,其次楼主在问这道题究竟在考什么,你们扯到public变量上跟这道面试题或者跟楼主的问题有半点关系么。Java是静态语言,对变量的引用是在编译期静态绑定的,自然只会绑定当前类的变量上(如果当前类没有定义这个变量,则试图绑定离当前类最接近的父类变量)。问题这只是java的实现方式,在面向对象理论中,没有明确说public的变量不能被子类覆盖。假如出现一种语言,它的public变量就是可以被覆盖,你也不能说它错。所以,如果题目中出现了public变量的覆盖问题,我倒真的会鄙视题目,不常用的语言特性有什么好考。你们是自己把题目的考点曲解为“在java中对象变量能否动态绑定”,然后自己反驳“考这个有什么意思”,自己立个靶子自己推,不亦乐乎。

就这道问题本身来看,你根本不需要知道java的具体实现,或者去试。只要有一点面向对象理论知识,知道“封装”的意图,就能轻易推断出不应该允许子类覆盖父类的private变量,否则你在写父类代码时,根本无法确认所使用的私有变量会不会被外部直接修改,还要封装干什么用。同样为了保证子类不会意外覆盖父类的私有变量,你在使用任何框架,继承出子类的时候就应该检查所有的祖先类避免重名,而事实上根本没人会这样做。所以如果我是面试官,这道题属于最基础的送分题,如果这都出错,我会认为这位考生第一不理解面向对象中的封装,第二没有在团队中工作的经验(正如楼主所说,“我写的父类如何如何,又怎么会在子类中如何如何”,而现实情况大部分是父类跟子类根本不是由同一个人在同一段时间中写的)。

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics