D 的个人博客

开源程序员,自由职业者

小而美的 Java 博客系统 Solo
Golang 在线 IDE Wide
黑客与画家的社区 Sym
  menu
402 文章
1,956 评论
3436602 浏览
19 当前访客
ღゝ◡╹)ノ❤️

面试题:为什么java不允许 super.super.xxx 这样的语句?

查阅了一些资料,实践后,有如下结论:
假设有: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
评论