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

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

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

1个回答

因为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中,都绝不能把派生类分割出基类来。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!