代码编织梦想

java中关键字 super表示的真正对象

java中的super,大家都知道是表示一个父类的引用。上次群里见到一个网友询问 super.getClass().getName()的输出问题,大部分都知道输出的是当前这个类的类名。而不是父类的名称。关于这个问题的解释很多,基本都是说getClass()是一个final方法,说这个方法都是调用超父类Object的方法。这个解释很好,也容易理解,不过,我们从super这个关键词的本质入手,就能更清楚,为什么super.getClass().getName()会输出当前类的名称了。

先定义两个类,一个父类,一个继承的子类。

父类:

public class Parent {

public String name;

private int code;

public Parent parent;

//定义几个父类成员属性,parent将指向this父类对象

public Parent()

{

//parent指向this,就是当前实例的父类对象,并输出hashcode和给code属性赋值

parent=this;

code=1001;

System.out.println("Parent's code is:"+code);

System.out.println("Parent hashcode is:"+this.hashCode());

}

//定义一个重载的构造方法,用于测试使用了哪个父类构造方法

public Parent(String name){

parent=this;

this.name=name;

System.out.println("Parent's name is"+name);

code=1002;

System.out.println("Parent's code is"+code);

System.out.println("Parent hashcode is:"+this.hashCode());

}

public int getCode()

{

//打印父类code属性值,

System.out.println("Parent :print code :"+code);

return code;

}

}

子类:

public class Child extends Parent{

public String childName;

private int childCode;

//定义两个类的不同修饰符的属性

public Child(String childName)

{

//给属性赋值

this.childName=childName;

//输出属性值,和类的hashcode值

System.out.println("child's childName is:"+childName);

System.out.println("child hashcode is:"+this.hashCode());

}

//测试方法

public void test()

{

//通过super获取父类中的parent,这个成员就表示了父类对象。

Child testChild=(Child)super.parent;

//强转parent为子类类型。并输出子类中定义的属性,和获取父类getCode()方法

System.out.println("testChild name is:"+testChild.childName);

testChild.getCode();

}

public static void main(String[] args) {

//实例化

Child c=new Child("window");

c.test();

}

}

运行输出结果:

Parent's code is:1001

//首先输出这句,可以表示,父类默认的构造方法执行了。

Parent hashcode is:11985823

//这里输出的父类this对象的hashcode码

child's childName is:window

//调用子类的构造方法,输出childName和hashcode码值,大家可以看到,父类的this对象和子类实例的对象,hashcode码是相同的。

child hashcode is:11985823

//这里执行test()方法的结果。

//使用Child testChild=(Child)super.parent 强制转换父类中指向父类this对象的parent对象为子类Child对象,并输出子类childName属性值。

testChild name is:window

//输出结果上可以看出,这个parent其实就是子类的实例对象。应该说内存中的对象是同一个,只是不同的表示方式。

//执行testChild.getCode(); 调用父类的getCode()方法,输出的和父类构造方法中的code值是相同的。

Parent :print code :1001

从上面可以看出super这个关键字所表示的引用父类对象,其实和当前实例化的子类对象在内存中是同一个对象,虽然不知道sun 的虚拟机是如何实现这个关键字的,但是这个super的等同效果就是(Parent)this,这里的this是当前代表当前实例化的子类对象。

通过在父类中添加一个Parent类型的成员,来指向父类实例化的那个this对象,达到引用父类对象的目的,使用super.parent来获得父类parent对象的引用。

运行的结果表明,这个parent应用的其实就是当前子类实例对象,通过强制转换为子类类型,这个父类Parent类型的parent也可以读取成员childName属性值。就表明了他们在内存中是同一个对象。而且他们的hashcode值也是相同的。

java说明中指出,super是代表父类对象的引用,而super()表示应用父类的默认构造方法,看起来这个super和c中的define有点相同作用的效果。在这个例子中,super代表的父类对象的引用,和父类中parent代表的都是父类对象的引用,parent其实就是当前内存中子类对象的引用,如同(Parent)this一样,这样就可以解释为什么使用(Child)super.parent可以得到子类成员childName。

回到开始的问题,super.getClass().getName(),这样,就很容易解释他为什么是输出当前类的名称了,因为构造一个实例化对象,其中,在父类和子类构造方法中,引用的对象都是同一个,都是当前实例化的子类对象。super关键字应该充当了一个类型转化的作用。

熟悉c的知道,c中经常使用强制转换指针类型来引用一些结构或变量的部分数据,如通过强制转换为不同结构类型,来引用不同数据大小的结构体。这里的应用效果应该等同,通过(Parent)Child可以通过转换为父类类型而只引用父类类型的那一部分数据。

在java中new一个对象,和c或c++这些和内存打交道的语言一样,都是会分配内存,在c中可能更直观一点,我们在此不讨论到底是分配了多大的内存问题。

在new一个子类的时候,上面例子看到,父类的成员同样也有赋值初始化,说明,同样在内存中也有保存父类的信息空间,(Object类的不讨论)。

一个抽象点的图:

0818b9ca8b590ca3270a3433284dd417.png 可能图表达不对,大概就是这个意思、

java中super父类对象引用_继承树追溯问题_心支柱的博客-爱代码爱编程

super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性。 案例小代码:   package com.jackfujia.oo2; public class TestSuper {     public static void main(String[] args) {          //        ChildCl

java中this和super关键字分别是什么意思-爱代码爱编程

this和super关键字 this是自身的一个对象,代表对象本身可以理解为指代当前的对象,它可以调用当前对象的属性、方法和构造方法,一般情况下可以省略,必须使用this的地方是区分出现名字重复的参数和属性 与this

super父类对象-爱代码爱编程

public class TestSuper { public static void main(String[] args) { System.out.println("开始创建一个ChildClass对象......"); new ChildClass2(); } } class FatherClass

this和super分别代表什么意思-爱代码爱编程

java中this关键字代表对象本身可以理解为指代当前的对象,它可以调用当前对象的属性、方法和构造方法,一般情况下可以省略,必须使用this的地方是区分出现名字重复的参数和属性(类属性和方法的形参)。 super相当于是指代当前的对象的父类,调用父类的属性、方法和构造方法   super和this有什么区别? this指代当前对象,super指代

JAVA之super父类对象的引用-爱代码爱编程

super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。 package cn.sxt.oo2; public class TestSuper01 { public static void main(String[] args) { new ChildClass().f(); }

java super父类的父类_java super关键字,super访问父类成员详解-爱代码爱编程

之情给大家介绍了一下super调用父类构造方法方面的内容,下面要接着给大家介绍的就是super访问父类成员方面的内容,分别对super调用成员属性以及super调用成员方法做了详细介绍。 在子类的成员变量或方法与父类同名的时候,可以使用super关键字来访问。 假如,子类重写了父类的某一个方法,也就是子类和父类有相同的方法定义,但是有不同的方法体,

java中用来表示父类对象的关键字_java面向对象中的关键字-爱代码爱编程

1,super关键字 super:父类的意思 1.  super.属性名 (调用父类的属性) 2.  super.方法名 (调用父类的方法) 3.  super([参数列表])(调用父类的构造方法) 注意:a.  super关键字使用在子类中 b.  子类继承了父类,则父类中的公有的属性,方法,就是子类的属性和方法.所以在子类中使用supe

java中表示父类对象的关键字是什么_Java基础语法(11)-面向对象之关键字-爱代码爱编程

title: Java基础语法(11)-面向对象之关键字 blog: CSDN 1.this this是什么 它在方法内部使用,即这个方法所属对象的引用; class Person{ private String name ; private int age ; public Person(String name,int age){

java关键字super指什么_java中super关键字与this关键字的区别是什么-爱代码爱编程

java中super关键字与this关键字的区别是什么 发布时间:2020-09-01 14:58:57 来源:亿速云 阅读:97 作者:小新 这篇文章给大家分享的是有关java中super关键字与this关键字的区别是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。 首先我们先来介绍以下super关键字与th

java调用父类方法的关键字_java中调用父类方法之super关键字的疑惑?-爱代码爱编程

在java中有super和this这2个关键字,我有时候对super有一些疑惑,我甚至认为我对super和this这2个关键字还没理解!大家请看下面的代码,帮我解惑一些呗!谢谢 package com.jiongmeng; class Father { String name; int age; public void test() { S

下列选项中关于java中super关键字的说法错误的是_下列选项中关于Java中super关键字的说法错误的是( )。...-爱代码爱编程

下列选项Perhaps language should be ________ as a road map and valuable possession. 在确定薪酬水平时,中关a中企业通常可以采用( )策略。 键字在线大学能够帮您做什么呢? 法错在线大学几个关键概念有哪些? 下列选项商业画布主要包括哪几大类? 中关a中价值网的特征