wyzrsics 2018-09-18 00:52 采纳率: 0%
浏览 858
已结题

java中super代表父类存储空间的标识(可以理解为父类引用)

网上资料说java中,
this代表本类对应的引用,
super代表父类存储空间的标识(可以理解为父类引用)。

为什么这里的super不直接说代表父类的引用,而说可以理解为父类引用?
却下定义为定义代表父类存储空间的标识?

  • 写回答

1条回答 默认 最新

  • threenewbee 2018-09-18 01:52
    关注

    因为java和c++设计思想有明显不同。
    c++的设计思想,起码从一开始来说,它是给c语言加上面向对象的特性,所以说你能明显看出在解决面向对象的概念的时候,它有很多妥协性和技巧性。
    比如:继承关系的子类,在存储上是基类叠加派生类。这就好比中国人他不天然就是一个人,而是中国人的肚子里必须装着人这个东西,人+中国的皮=中国人。
    再比如,所谓“成员函数”,在c++里其实根本就不存在,实际上就是传统的函数,函数的参数中加上一个隐藏的this指针。所谓的虚函数,就是在类中增加了一个函数名索引指针的数组(虚表)
    当然,c++在语法上还是会做一些访问控制的判断,但是抛开这些不说,你完全可以将一个c++写的程序,在语言层面“展开”得到一个纯粹的c程序。
    比如
    class A
    {
    public: int x;
    void foo() { ... }
    };

    int main()
    {
    A a1, a2;
    a1.foo();
    }
    完全可以写成
    typedef struct
    {
    int x;
    } A;
    void foo(A * this) { ... }
    int main()
    {
    A a1, a2;
    foo(&a1);
    }
    实际上,早期(上世纪80年代),c++编译器就是这么干的:它先把代码转换成c程序,再编译成程序。

    而java在设计之初,就是完全面向对象的,你很少在java语言层面看到和具体实现“绑定”的东西。比如说虚函数怎么实现的,基类怎么存储的,这些在语言层面并不重要。实际上任何人都可以根据java的语言规范自己决定怎么实现这些面向对象的特性。具体到super,它仅仅是派生类调用基类定义的成员的一种方式。但是java并没有假定“中国人的身体里有个人”,或者"大象的身体里有个哺乳动物"。所以不存在所谓“父类存储空间的标识”。

    顺便说下,c++ 必须记住父类存储空间的标识这种和面向对象没有什么关系的东西。因为c++的面向对象是不彻底的。所以一不小心就穿帮了。比如说释放一个实际上是派生类实例的基类指针的话,就会只释放一部分内存。这在java程序员看来是很奇怪的。java中,或者说完全的oopl中,都绝不能把派生类分割出基类来。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)