面试题:为什么java不允许 super.super.xxx 这样的语句?
来源:互联网 发布:python局域网传输文件 编辑:程序博客网 时间:2024/05/01 11:02
查阅了一些资料,实践后,有如下结论:
假设有:A->B->java.lang.Object,
1. this 与 super 是完全不同了两个关键字。this指的就是当前对象,而super行为比较怪异:
的结果都是相同的,都是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 这样的语句?老孙之看法,欢迎分享交流
- super.super.xxx为什么不行
- java面试题总结之super()与this()的区别
- 有关this和super的面试题
- this和super的区别,面试题
- Java super语句
- java super 语句的理解以及注意事项!
- Java面试题之super.getClass方法调用
- Java面试题之super.getClass方法调用
- 《java入门第一季》之面向对象面试题(this和super的区别)
- 面试题:this、super、以及程序初始化的顺序问题
- JAVA SUPER的学习
- java的super
- java的this、super
- java super的使用
- java super的使用
- java的super关键字
- 中断寄存器
- asp.net控件设计时支持(1)----基础认识
- 处理器如何发现中断信号?
- 贪食蛇程序
- 通讯录
- 面试题:为什么java不允许 super.super.xxx 这样的语句?
- 俄罗斯方块
- sed的使用
- IOCCC--国际混乱C代码大赛
- 迷宫
- ThoughtWorks专访:一个没有经理室的公司(图)
- 博客客户端工具使用简要总结
- StringTokenizer:字符串分隔解析类型
- Silverlight 2学习教程(二):开发简单的Silverlight 2应用程序