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

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

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

0

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

-2
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java中super父类对象引用_继承树追溯问题
super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性。 案例小代码:   package com.jackfujia.oo2; public class TestSuper {     public static void main(String[] args) {          //        ChildClass ccs = new ChildCl...
JAVA基础再回首(六)——父与子的继承、super关键字、方法重写、方法重载
JAVA基础再回首(六)——父与子的继承、super关键字、方法重写、方法重载 不墨迹,才是时间管理的最大利器,学无止境。 继承 首先我们来学习继承的概述多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。 通过extends关键字可以实现类与类的继承 格式:class 子类名 extends 父类名 {} 单独的这个类称
java中调用父类方法之super关键字的疑惑?
在java中有super和this这2个关键字,我有时候对super有一些疑惑,我甚至认为我对super和this这2个关键字还没理解!大家请看下面的代码,帮我解惑一些呗!谢谢package com.jiongmeng; class Father { String name; int age; public void test() { System.out.println("我是父...
通过super调用父类属性和方法
class Person{ String name; int age; //父类的构造方法 public Person() { } public String talk() { return "i am:"+this.name+", i am "+ this.age +"years old"; }} class Student e
子类调用父类方法(super关键字)
package testextends; public class Pad3 extends Computer3{ //子类:平板电脑 String sayhello(){ //重写父类方法‘打招呼’ return super.sayHello()+ "ipad";//调用父类方法并添加字符串 } public static void main(Strin...
静态方法不能使用 super 调用父类静态方法
public class SuperCalc { protected static int multily(int a, int b) { return a * b; } }public class SubCalc extends SuperCalc { public static int multiply(int a, int b) { in
类继承中super的使用
使用super访问父类的域和方法 正是由于继承,使用this可以访问父类的域和方法,但有时为了明确地指明父类的域和方法,就要用关键字super。 例如:父类Person中一个字段age,在子类Student中使用age, this.age, super.age来访问age是完全一样的。当然,不能使用super访问子类中的添加的域和方法。 有时需要使用super以区别同名的域和方法使用super可以
Java中使用super关键字调用父类的构造方法
package four; //定义一个类 class Animals2{ public Animals2(String name){ System.out.println("我是一只"+name); } } //定义Mouse类继承Animals类 class Mouse extends Animals2{ public Mouse() { super("米奇鼠"); }...
子类方法中super.父类方法
1.子类方法super.父类方法,并且有自己的方法体内容下面代码中,子类方法中的“super.”的意思就是父类对象调用该方法2.一个类中只能有一个public的class,别的只能是默认类型或者其他3.main必须是static才能运行4.创建内部类对象,内部类必须是static;创建和主类并列的普通类对象,可以不加static-----------------------------------...
super关键字调用父类构造方法
直接上代码 public class Card { String title; Card() { title = "新年快乐"; } Card(String s) { title = s; } public String GetTitle() { return title; } } public class Christmas exte...
Java 子类调用父类构造函数----super()详解
Java 子类调用父类构造函数----super()详解
方法的调用以及用过super.的方式来调用。三种
两种方式: package point_error; public class method_use { public static void main(String[] args) { max_and_min(-1); } private static void max_and_min(int a) { if(a<0){ System.out.println("太小了"); }
二十一、面向对象3—继承:重写、调用父类的两种方法、super()、isinstance(obj, Class) 、多继承、私有的属性和方法的调用
一、继承的示例: 二、子类继承父类、父类的父类 三、在子类中重写父类的方法 在子类中再写一个父类有的方法,就会先使用自身类的方法,如果自身没有该方法,则会使用父类的方法。 调用的顺序:会先使用自身类的方法,如果自身没有该方法,则会使用父类的方法。 四、在子类中调用被重写的父类的方法(两种方法) (1)第一种方法:   类名.方法名(self)             【...
子类与父类属性或方法重名时,使用super.(属性名/方法名)调用父类型属性或方法
public class Test { public static void main(String[] args) { Sub s = new Sub(); s.test(); }//main } abstract class Super{ int x,y; public Super(){ x=3; y=4; } public void test()
使用父类方法一定要用super吗(写给新人)
今天,在群里有人问(估计是新手)。答案,不一定。只有当子类重写了父类的方法时,如果需要用到父类的方法时,才要用super,表明这个方法时父类的方法不是子类的方法。不理解?上代码: Father类 public class Father { public String str = "父类变量"; public String strOnly = "父类变量,子类没有同名变量";
Java继承时,父类中的this指向子类对象
代码如下 父类 public class Car { public void fool() { System.out.println("Car:fool1"); } public void foo2() { this.fool(); System.out.println("Car:fool2"); } } 子类 public class
Java继承,子类默认在构造函数中用super()调用父类构造函数
1.子类继承父类的方法属性,并重写父类的方法,子类修饰符不能比父类方法的修饰符的范围狭窄。 Protect 与 默认 区别: protected :成员 本类和子类可以访问。【其他类不可以使用(即使同一个包中)】 Frinedly(友好/默认):成员 本类和子类,同包可以访问【其他类可以使用】 继承中的构造方法的执行顺序:父类有构造函数,子类也写构造方法的时候必须显示的调用父类的构造方
JAVA中super和this调用构造函数
this 和super只能在构造函数中有有一个,且都必须是构造函数当中的第一行。 super关键字,子类可以通过它调用父类的构造函数。 1、当父类的构造函数是无参构造函数时,在子类的构造函数中,就算不写super()去调用父类的构造函数,编译器不会报错,因为编译器会默认的去调用父类的无参构造函数。 class hood { public hood(){ System.out
Java入门学习-理解super,this,@override的用法
一、super和this1、this 指向自己的引用。 我之前一般都在构造函数中用thisclass parents{ int x,y; public parents(int x,int y) { this.x=x; this.y=y; } }用法: this.x 指向当前的x字段 this.method() 指向当前的
关于子类和父类中的this的用法
在看毕向东java视频的时候,多态这一章讲到了一段代码: public class Demo { public static void main(String[] args) { Fu f = new Zi(); f.show(); } } class Fu { int num = 1; void show() { System.out.println(this.num)
Java 构造函数中的super()
public class Test { public static void main(String[] args) { new Son(&quot;baidu&quot;); new Son(); } } class Farther{ public Farther(){ System.out.println(&quot;I am fa...
Java继承时,父类中的this/super指向子类对象(多态)
public class BaseTest { protected final String TAG = this.getClass().getSimpleName(); } public class TestChi extends BaseTest { public TestChi() { System.out.println(&quot;TAG:&quot;+TAG); }...
python类相关,super调用父类被重写的方法
python类相关,super调用父类被重写的方法 简单的小实例: # -*- coding: utf-8 -*- class Person: def __init__(self,name): self.name=name self.email=&quot;frosttry@gmail.com&quot; def f(self): print(&quot;P...
方法重写,抽象方法必须重写,抽象类。super.父类里面的方法调用方法。
方法重写(又称为方法覆盖,方法复写) 应用场景:子类想有自己的功能,又想得到父亲的功能。 super.父类里面的方法,可以调用父类里面的方法,因为super代表的是父类引用数据类型的变量。 1.抽象类:有抽象方法的类必定是抽象类,抽象类一定要被继承,而且抽象方法一定要被重写,所以凡是继承了抽象方法一定要重写,但是普通方法并不要求必须重写方法。 abstract不能和private fina
super关键字和函数覆盖(Override)
4.3 super关键字(1)super:代表的是父类,用法和this相似。可以使用super调用父类中构造方法,成员变量与成员方法。例如:super.age=10;其中age是父类中的变量。 (2)this代表本类对象的引用,即父类的内存空间的标识,super代表父类所属的空间。 (3)当子父类出现同名成员时,可以用super进行区分。 (4)子类要调用父类构造函数时,可以使用super语句
父类中this的含义
父类中this指代的是那个对象? 最近打算把《第一行代码》这本书再看看,之前都是随用随学,有些东西并没有理解的很好。再看到第二章的时候,看到了如下代码: public class BaseActivity extends AppCompatActivity { private static final String TAG = &quot;BaseActivity&quot;; @Override...
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 和 父类名调用父类成员的区别
关于使用 super 和 父类名调用父类成员的区别super 的用法分为两种 (一般在有继承关系的时候才会用):父类名调用成员用法:一下举个例子 super 的用法分为两种 (一般在有继承关系的时候才会用): 调用父类中被重写或被隐藏的成员,(也可以访问非隐藏或重写的成员); class F { public void display(){ System.out.println(" Fa...
java中多态父类的成员变量和方法调用问题
class Super { String name = “父类名字”; public void setName(String name) { System.out.println(this.getClass()); this.name = name;//赋值给父类的name,name 为字段指向当前类的字段 } public
多继承传入参数的问题?提示找不到父类?提示没有父类的属性?用super有问题?
多继承,一个子类继承了多个父类。那么多继承如何在子类生成实例时,将参数传入多个父类方法/属性呢?用super吗,好像只能把参数传入第一个继承的父类。 这里学习的多继承与多重继承不一样。这里单纯指一个儿子,继承了母亲和父亲。而没有额外扩展到母亲、父亲又继承了自个儿的爸妈。 #我们知道子类继承了父类的方法,当子类调用一个方法时,优先找子类自己内部,如果没有这个方法,转而再找继承的第一个父类
Java中静态代码块、构造方法、代码块、父类与子类之间执行顺序及父类子类实例化对象
PS:今天群里一个小伙伴笔试,匆匆发来的求助信息。。。1.父类、子类之间代码块与构造方法public class HelloA { public HelloA(){ System.out.println(&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;HelloA&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;); } {System.out.println(&amp;amp;amp;amp;amp;
java--继承、super与this的区别
继承   说到继承就想到了我们常说的子承父业,java中的继承(extends)也就是运用了这种思想,这样可以减少代码的重复率以及方便维护。 super this 父类对象的引用 本类对象的引用 super.成员变量(或成员方法)调用父类成员变量(或成员方法) this.成员变量(或成员方法)调用本类成员变量(或成员方法) super(...)调用父类构造方法 this(...)...
子类super调用父类函数,该函数中调用的函数是父类还子类呢
如图所示: 子类对象通过super()函数调用父类的run函数,然后直接调用了子类的demo函数,而没有调用父类的函数;猜想通过super调用父类,但self仍然代表是子类本身; 再看一例: 从这里说明self代表是子类本身;super的直接将run代码copy到子类中来; 还看一例: 从这里就说明了一切,通过super函数调用父类函数,等同于将父类中的函数copy到子类中执行;对...
在调用父类的构造方法时,super必在子类构造方法的第一行,否则会报错
/** * 在调用父类的构造方法时,super必在子类构造方法的第一行,否则会报错*/class Demo6{//显示定义了有参构造方法,这个类就没了隐藏了的无参构造方法public Demo6(String name){this.name = name;this.age = 0;}String name;int age;public void sleep(){System.out.println
ES6中super的使用
ES6中super用于类继承,有二种方式: 直接作函数使用,但只能用在构造函数中; 作为父类,可调用父类的方法和属性(包括静态)。第一种方式有二点要注意,在构造函数中用this之前,必须先使用super。 另一点算是super的BUG吧。当父类和子类都重写了构造函数时,如果在子类构造函数中设置类属性~如:this.prop = [];将会报错。具体见:http://stackoverflow.
父类方法中使用this,那么这个this指的是谁?
一直在用一些东西,却总是感觉有一些疑惑,今天发现了自己一个及其致命的意识错误。关于父类中this关键字到底是谁的问题。请看代码 父类Parent public class Parent { public Parent(){ System.out.println("父类自己---->"+this); } public void onCreate(){ System.out.prin
Python调用父类方法-super
在子类中调用父类的某个已经被覆盖的方法,需要使用 super() 函数。 class Parent(object): def spam(self): print('Parent.spam') class Child(Parent): def spam(self): print('Child.spam') super().s...
super关键字(访问父类成员)
当子类重写父类的方法后,子类对象就无法直接访问父类被重写的方法。 为了解决这个问题,在Java中专门提供了一个super关键字来访问父类的成员,例如访问父类的成员变量、成员方法和构造方法。 class Animal{ String name=“动物”; void shout(){ System.out.println(“动物发出叫声”); } } class Dog extends Animal{...
使用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){ ...
Java中的继承、方法覆盖(方法重写)、super关键字、多态
Java继承 继承 继承是面向对象的一个重要的特性,它体现了类与类之间的一些逻辑关系,目的是为了代码复用(以减少开发成本)。当多个类之间有一些共同的属性(成员变量)和功能(成员方法)时,我们可以将他们共同的部分拿出来作为一个父类定义实现这些共性,这些类中可以不再定义这些共性而直接继承父类,得到这些属性和功能。 继承体现了客观事物中事物的层次关系。在Java程序中支持单继承(任何一个子类都只能有...