面试题:为什么java不允许 super.super.xxx 这样的语句?
2008-04-06 15:21
295 查看
查阅了一些资料,实践后,有如下结论:
假设有:A->B->java.lang.Object,
1. this 与 super 是完全不同了两个关键字。this指的就是当前对象,而super行为比较怪异:
Java code
的结果都是相同的,都是A,因为它们都返回run-time类A的实例。另外,在java.lang.Class中有一个getSuperclass(),
这个就可以获得其superclass了,有兴趣的可以试试 :-)
2. super.super.xxx历史上是可以的:
参考:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4209952
有了如上技术的知识,在加上对OO的理解,我们就可以说明
为什么java不允许 super.super.xxx 这样的语句?
原因如下:
1. super.super.xxx违背了OO的基本原则
试想在类A中super.super.xxx的调用其实恰好说明了class A is NOT a kind of B的子类,违背了基本的is-a的继承原则
进一步说明:super.super.xxx 的形式其实就是一种“纯”的委托,不要被super这个关键字迷惑:-)
2. super.super.xxx还是违背了OO的基本原则
在继承体系设计中,子类会继承父类的方法的
在没有overwrite父类的时候,super.super.xxx的方法其实是多次一举的;
在overwrite父类之后,super.super.xxx的调用的没有理由的,OO中有一条原则就是不要继承非抽象类,换
句话说,要用到super.super.xxx的话,这个OO设计是彻底失败的;
3. super.super.xxx实现的问题(偶瞎想的,仅供参考)
在Java中,super是指向父类的,既是对父类的引用,又是父类的实例;但又不是对父类的引用,更不是父类的实例。
只是用法类似,看上去很类似而已。要实现这个,不是不可能,但是从编译器构造的角度看,会多出很多语义解析的步骤。
综上,在Java这个以OO为核心的语言中,从语言设计者的角度看,super.super.xxx的想法是得不偿失的,从使用者的角度看,
super.super.xxx的做法是相当朦胧的,呵呵。。。。
=======================
更多的讨论参看:
http://topic.csdn.net/u/20080403/22/23166697-8f88-451d-b070-b925fa78e645.html?seed=623324090
假设有:A->B->java.lang.Object,
1. this 与 super 是完全不同了两个关键字。this指的就是当前对象,而super行为比较怪异:
Java code
class A extends B{ void foo(){ this.getClass().getName(); super.getClass().getName(); ((B)this).getClass().getName(); ((A)this).getClass().getName(); } }
的结果都是相同的,都是A,因为它们都返回run-time类A的实例。另外,在java.lang.Class中有一个getSuperclass(),
这个就可以获得其superclass了,有兴趣的可以试试 :-)
2. super.super.xxx历史上是可以的:
参考:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4209952
有了如上技术的知识,在加上对OO的理解,我们就可以说明
为什么java不允许 super.super.xxx 这样的语句?
原因如下:
1. super.super.xxx违背了OO的基本原则
试想在类A中super.super.xxx的调用其实恰好说明了class A is NOT a kind of B的子类,违背了基本的is-a的继承原则
进一步说明:super.super.xxx 的形式其实就是一种“纯”的委托,不要被super这个关键字迷惑:-)
2. super.super.xxx还是违背了OO的基本原则
在继承体系设计中,子类会继承父类的方法的
在没有overwrite父类的时候,super.super.xxx的方法其实是多次一举的;
在overwrite父类之后,super.super.xxx的调用的没有理由的,OO中有一条原则就是不要继承非抽象类,换
句话说,要用到super.super.xxx的话,这个OO设计是彻底失败的;
3. super.super.xxx实现的问题(偶瞎想的,仅供参考)
在Java中,super是指向父类的,既是对父类的引用,又是父类的实例;但又不是对父类的引用,更不是父类的实例。
只是用法类似,看上去很类似而已。要实现这个,不是不可能,但是从编译器构造的角度看,会多出很多语义解析的步骤。
综上,在Java这个以OO为核心的语言中,从语言设计者的角度看,super.super.xxx的想法是得不偿失的,从使用者的角度看,
super.super.xxx的做法是相当朦胧的,呵呵。。。。
=======================
更多的讨论参看:
http://topic.csdn.net/u/20080403/22/23166697-8f88-451d-b070-b925fa78e645.html?seed=623324090
相关文章推荐
- 面试题:为什么java不允许 super.super.xxx 这样的语句?
- 面试题:为什么java不允许 super.super.xxx 这样的语句?
- 面试题:为什么java不允许 super.super.xxx 这样的语句?
- 为什么java不允许 super.super.xxx 这样的语句?老孙之看法,欢迎分享交流
- 为什么JAVA只允许单继承
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
- 程序执行正确, 但退出时崩溃在main() 最后一个语句之后。为什么会这样?
- 【转】为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
- 为什么eclipse模拟器上可以运行app,插上真机后却不可以运行还会出现com.example.xxx这样的错误
- 你知道为什么考你这个?——Java面试题及答案汇总分析(2)
- java面试题之try中含return语句时代码的执行顺序详解
- 【那些年我们一起做的java面试题】---------1.开篇立论(我为什么要写博客)
- Java基础面试题1-String类为什么是final的
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
- Java面试题-try...finally结构中try中有return那么finally中的语句的执行时间问题
- 为什么java的构造方法中this()或者super()要放在第一行
- Java面试题之super.getClass方法调用
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
- 为什么在mysql数据库可以运行的SQL语句,在java里却报错!!
- JAVA中要使用 super() 调用父类的构造函数时,为什么要是第一句调用?