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问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
子类和父类中的super、this的区别
在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,new这个子类的实例对象后。使用super来引用父类对象,使用this引用当前对象。       public class F{//定义父类    public void s(){//定义父类方法s    } } public class K extends
子类继承父类(super)
public class Animal { public void chi(){ System.out.println(“吃”); } } public class Cat extends Animal { @Override public void chi() { //覆写的方法为空 } } 新建子类实例,...
javaSE super()父类构造函数
Student.java:package cn.xxx.demo; /* * 子类构造方法的报错原因: 找不到父类的空参数构造器 * 子类中,没有手写构造,编译器添加默认的空参数的构造函数,且第一行是super()。 * public Student(){ // 编译器自动添加的构造函数。 * super(); * } * * 注意: 子类中所有的构造方法,无...
super();调用父类构造器
this()和super()调用构造器的区别上篇文章,使用this()调用本类中的构造器,今天接着写super()调用父类的构造器。super()调用父构造器的用法 必须要在子类构造器执行体的第一行 this调用和super调用不会再同一个构造器的执行体内同时出现 爷爷-父亲-孙子构造器的执行流程 public class grandfather { public grandfathe
super()获得父类的定义
课程概述<br />rn本套课程2018年更新第一季共115集<br />rnPython人工智能课程共400集,从零基础开始,全面讲解Python基础,直达可以手写神经网络的境界。<br />rn<br />rn我们创造性的增加了:手写数据结构和算法、手写神经网络项目。让零基础学员在学习Python时就开始接触高深的底层知识、神经网络底层实现的知识。<br />rn内容共分26章,讲解了Python基础的方方面面,可以作为Python学习者的“宝典”。同时,穿插了3个大型实战项目。<br />
super调用父类的方法
在子类中, super().__ init __(name,age) 或者super().run()等调用父类其他方法,都可以省略self参数 也可以避免在砖石继承中调用两次基类的方法 class baseClass: num_base_calls = 0 def call_me(self): print('calling method on Base Class'...
super调用父类的构造函数
java基础企业级入门视频教程:1、Java的基础语法;rn (1)java的起源,java的发展,语言特点rn2、java的企业级体系知识;rn (1)J2EE的常用API
java 中super调用父类构造方法的用法
public class LoadCar extends Car rn public void loadCar(int id,String name,double price,int load)rn super(id,name,price,0,load);//[color=#FF0000]这里为什么提示构造函数调用不是构造函数的第一个语句,我明明输入的在第一行啊啊啊[/color]rn rn
java中继承父类后this和super的区别
这个具体等忙过手头的事情再好好整理下  说下目前的现象就是: class A extends classB 然后在classA的方法中this.属性不生效,但是super.属性却可以生效
Java如何调用父类的父类的中的方法
1.可以用反射实现 2.可以用虚拟机级别的invokeddynamic实现(基于java1.7版本以及以上才可以) 代码如下: /** * @(#)Text4.java * * * @author * @version 1.00 2016/12/6 */ import java.lang.invoke.MethodHandle; import java.lang.inv
使用Super调用父类的构造方法
/*一个类的构造函数的功能是给其成员变量赋值*/ package learnJava; class S{ int x,y; S(){ x=100; y=200; } S(int x,int y){ this.x=x; this.y=y; } } class R extends S{ int z; R(int x,int y){ ...
super 关键字调用父类的构造器.
super 关键字调用父类的构造器. 语法: super([arguments]); // 调用 父对象/父类 的构造函数 super.functionOnParent([arguments]); // 调用 父对象/父类 上的方法 描述: 在构造函数中使用时,super关键字将单独出现,并且必须在使用this关键字之前使用。super关键字也可以用来调用父对象上的函数。 例如: class Po...
Java 子类调用父类构造函数----super()详解
Java 子类调用父类构造函数----super()详解
继承、子类和父类、super和继承
继承 可以多重继承 子类和父类 重写和重载 super和this
Python调用父类方法-super
在子类中调用父类的某个已经被覆盖的方法,需要使用 super() 函数。 class Parent(object): def spam(self): print('Parent.spam') class Child(Parent): def spam(self): print('Child.spam') super().s...
super调用父类构造方法的演示
标题super调用父类构造方法的演示 //super的演示 public class SuperDemo { public static void main(String[] args) { } } class Aoo{ int a; Aoo(int a){ this.a=a; } } class Boo extends Aoo{ Boo(){ //...
super解决父类重复初始化
本视频致力于打造最适合Python初学者的入门视频,站在初学者角度,从零开始、由浅入深,以朴实生动的语言来阐述复杂的问题,其中列举了大量现实中的例子进行讲解,真正做到通俗易懂。 本视频涵盖Python基础语言、流程控制、数据结构、函数、模块与包、面向对象、文件、异常等核心知识点。当学完一个章节的知识点,通过每章实用性强的案例,将所学知识综合运用到实际开发中,积累项目开发经验。
java 子类和父类中方法的引用
public class SuperA { public SuperA(){ printX(); } public void printX(){ System.out.println(&quot;hello superA!&quot;); } }   public class SuperB extends SuperA { public SuperB(){ pri...
子类继承父类,父类中的构造器
子类继承父类时,父类中必需有无参构造器,子类才可以继承父类? 可是父类中只有有参构造器时,就不能实现子类继承父类了吗?
python中通过super()调用父类构造方法
可能是java写多了,当我准备通过super(self,xxx)这样调用父类的构造方法时候,一直报错,上网查资料,发现python的super()的机制和java还是有很大区别的。 首先看一下super()函数的定义 super([type[,object-or-type]]) Return a **proxy object**that delegates method calls to a
【39】父类子类中关于super
public class Test { public static void main(String[] args) { System.out.println(new BigDog(&quot;大黑狗&quot;, &quot;黑色&quot;)); } } class Dog { String name; // public Dog() { // super(); // ...
子类引用父类构造方法
java训练题目 编写程序实现子类对父类构造方法的引用?
隐藏,引用父类的虚函数
隐藏,引用父类的虚函数
父类引用子类对象
学习过java的人都知道,java语言中存在向上转型和向下转型。向上转型是指从更具体的类型被引用为较抽象的类型,或者是表示范围小的向范围大的转化。如 father f=new son();或是long a=(long)n;后者的理解比较简单,C语言中已经讲的很明白了,重要的是分析前者。 父类引用子类对象的情况,一般是在实现和使用接口中使用,一是为了方便调用接口的方法,二是更好的处...
QT引用父类变量
创建一个Dialog类,上面有一个QLineEdit成员,另外在Dialog成员上创建一个类QWidget。我想在QWidget成员里引用Dialog成员的QLineEdit变量,该如何引用?
子类实例化父类引用
super是父类,sub是子类rnsub里面有方法p(),父类里面没有p()方法rnrn然后子类实例化父类引用rnrnsuper A = new sub()中rnrn请问为什么rnrnA.p() 会报错?rnrnrnrn原题目如下:rn[img=https://img-bbs.csdn.net/upload/201511/05/1446734893_52410.png][/img]rnrnrn[img=https://img-bbs.csdn.net/upload/201511/05/1446735025_977929.png][/img]rnrnrn[img=https://img-bbs.csdn.net/upload/201511/05/1446734903_749276.png][/img]rnrnrnrnrnrnrnrn
java中的子父类
子类构造函数的特点     在子类中所有的构造函数的第一行都默认存在着super()语句,调用父类的构造函数。     调用本类的构造函数用this(实参列表)     调用父类的构造函数用super(实参列表) 注:1.this和super不能同时存在,二者都应该放在构造函数的第一行        2.当父类没有空参数构造函数时,子类需要显示定义super(参数)语句指定要访问的父
Java零基础-父类中的this
Java视频教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。如果您是非计算机专业,想转行做Java开发的朋友,或者您想让Java基础更扎实
关于使用 super 和 父类名调用父类成员的区别
关于使用 super 和 父类名调用父类成员的区别super 的用法分为两种 (一般在有继承关系的时候才会用):父类名调用成员用法:一下举个例子 super 的用法分为两种 (一般在有继承关系的时候才会用): 调用父类中被重写或被隐藏的成员,(也可以访问非隐藏或重写的成员); class F { public void display(){ System.out.println(" Fa...
[方法的重写]扩展父类方法,super对象调用父类方法
第一阶段(4-10天)rn 该阶段我们正式进入Python这门语言的学习,我们会学习Python语言的核心语法及进阶内容。rn第二阶段(11-13天)rn 该阶段我们会学习面向对象(OOP)这一重要的编程思想rn第三阶段(14-15天)rn 该阶段是项目演练阶段,我们会带领大家通过使用之前学习过的知识开发飞机大战这一经典游戏。
子类继承父类,父类是否可以前向声明?
[code=C/C++]rnrnclass A;rnrnclass AA : public Arnrn ...;rnrnrn[/code]rnrn如上代码,前向声明A,AA继承A,可是编译出错,请问,是否可以这样用?
*父类的引用可以访问子类的方法吗
abstract class Animal rn private String name;rn Animal(String name) this.name = name;rn public void enjoy()rn System.out.println("叫声......");rn rn public abstract void enjoy();rnrnrnabstract class Cat extends Animal rn private String eyesColor;rn Cat(String n,String c) rn super(n); rn eyesColor = c;rn public void enjoy() rn System.out.println("猫叫声......");rn rn public abstract void enjoy();rnrnrnclass Lady rn private String name;rn private Animal pet;rn Lady(String name,Animal pet) rn this.name = name;rn this.pet = pet;rn rn public void myPetEnjoy()rn pet.enjoy(); //传递的是Cat型的c,但这个pet不是Animal类型的吗?又没有强制转换为什么输入的是"猫叫声"呢,而不是"叫声"呢,父类引用不是不可以访问子类的变量和方法吗?rn rnrnrnpublic class Test rn public static void main(String args[])rn Cat c = new Cat("catname","blue");rn Lady l1 = new Lady("l1",c);rn l1.myPetEnjoy();rn rnrn
父类的引用可以调用子类的对象
父类的引用可以调用子类的对象,这句话该怎么理解,还有线程和类之间有什么样的关系,在具体的程序中如何知道它是一个线程?
非抽象父类可以引用子类么
public class arn....rnend classrnrnpublic class brninherits arn.....rnend classrnrndim a1 as arndim b1 as new brna1=b1rn
子类继承父类,父类的初始化
《Thinging in Java》的引用 基础类及衍生类,而不再是以前的一个,所以在想象衍生类的结果对象时,可能 会产生一些迷惑。从外部看,似乎新类拥有与基础类相同的接口,而且可包含一些额外的方法和字段。但继承并非仅仅简单地复制基础类的接口了事。创建衍生类的一个对象时,它在其中包含了基础类的一个“子对象”。这个子对象就象我们根据基础类本身创建了它的...
“父类 变量 = new 父类的派生类”和“父类的派生类 变量 = new 父类”
“父类 变量 = new 父类的派生类” :我认为正确,但有的书本上写着“父类的派生类 变量 = new 父类”,这样正确吗?
在JAVA中如何在子类中访问父类的父类成员
请高手指点一下:rn class Arn void fun()rn System.out.println("AAAA");rn rnrnclass B extendsrn void fun()rn System.out.println("BBBB");rn rnrnclass C extends Brn void show()rn //如果要在此处访问类A中的方法fun()如何写代码?rn rnrn请高手指点,小弟不胜感激。
Java中父类引用转化为子类引用
[code=java]rnclass Employee implements Cloneablernrn ...rn public Object clone() throws CloneNotSupportedExceptionrn rn Employee cloned =(Employee)super.clone();rn cloned.hireday=(Date)hireday.clone();rn ....rn return cloned;rn rn ...rn[/code]rn这里clone了一个Object对象,返回一个引用,将它转化为Employee类的引用,这里子类引用就指向了父类对象,那按理说,父类对象应该没有子类对象的实例啊,那为什么可以调用cloned.hireday?rnrn求大神解释?
java中super父类对象引用_继承树追溯问题
super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性。 案例小代码:   package com.jackfujia.oo2; public class TestSuper {     public static void main(String[] args) {          //        ChildClass ccs = new ChildCl...
父类中引用子类中的特有类型
如何在父类中引用子类中的特有类型 (如 子类form上关于某个表的TableAdapter),目前思路是在父类中添加遍历子类中的所有东西(如 遍历继承form上的所有控件),找到需要的之后,把它转化会需要的类型使用它.是不是可以使用反射之类的这个object转化为需要的类型. rn代码如下: rn//父类中遍历子类form上的控件,并使用它的 rnprivate void findcontrol(Control.ControlCollection controls) rn rn foreach (Control ctrl in controls)//类似这样遍历子类中的控件或组件rn rn if (ctrl.GetType().Name == "客户TableAdapter")//客户表单上某个表的TableAdapter rn rn //把ctrl强类型化为客户TableAdapter来使用 rn //例 客户TableAdapter.Update(客户DataTable); rn //让ctrl像,客户TableAdapter那样用 rn rn findcontrol(ctrl.Controls); rn rnrn
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池