zoukankan      html  css  js  c++  java
  • 面试题:为什么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
  • 相关阅读:
    MySql索引
    HashMap 底层解析
    https超文本安全传输协议
    多线程
    过滤器和拦截器
    计算机操作系统
    计算机网络
    java线程内存模型JMM
    jvm
    数据库
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470384.html
Copyright © 2011-2022 走看看