欢迎光临散文网 会员登陆 & 注册

Java零基础快速入门|Super(下)

2021-02-19 13:37 作者:动力节点小王本王  | 我要投稿



本篇文章主要内容

super 使用在实例方法中

难点解惑


super 使用在实例方法中

super this 都可以使用在实例方法中,并且都不能使用在静态方法当中,“this”大部分情况下都是可以省略的,只有在方法中区分局部变量和实例变量的时候不能省略。那“super什么时候可以省略,什么时候不能省略呢?

运行结果如下图所示:

super 和this

我们发现 printName()方法中的 super.name this.name 最终输出结果是一样的,这是为什么呢?请看以上程序执行的内存图:

父类的构造方法执行结束之后的内存图
子类的构造方法执行结束之后的内存图

 通过以上内存结构图发现 this.name super.name 实际上是同一块内存空间,所以它们的输出结果是完全一样的。接下来,我们再把以上的PaperBook 类修改一下:

运行结果如下图所示:

super 和this 的区别

为什么super.name null 呢,我们一起来看看以上程序的内存图:

父类Book 的构造方法执行之后的内存图
子类PaperBook 的构造方法执行结束之后的内存图

通过以上内存图可以清楚的看到,父类 Book 的构造方法在执行的时候给 super.name 赋值null,子类PaperBook 的构造方法在执行的时候给this.name 赋值“零基础学Java I”,由于在子类PaperBook 中定义了重名的变量name 导致在当前对象中有两个name,一个是从父类中继承过来的,一个是自己的,如果此时想访问父类中继承过来的 name 则必须使用super.name当直接访问name 或者this.name 都表示访问当前对象自己的name

通过以上的学习,大家知道 super 在什么情况下不能省略了吗?当父类中有该实例变量, 子类中又重新定义了同名的实例变量,如果想在子类中访问父类的实例变量,super 不能省略。实例方法是这样吗?我们可以来测试一下,请看代码:

运行结果如下图所示:

运行结果

过以上测试得出最终结论:父类和子类中有同名实例变量或者有同名的实例方法,想在子类中访问父类中的实例变量或实例方法,则super 是不能省略的,其它情况都可以省略。


难点解惑

Java super 存储的是一个父对象的内存地址吗?this 保存了内存地址指向了当前对象, 那么super 也是保存了内存地址指向了当前对象的父对象吗?

这个理解是错误的,在 Java 程序中创建 Java 对象的时候会调用构造方法,在构造方法执行之前会先调用父类的构造方法,在这里说明一下,调用父类的构造方法实际上并不是创建父类对象,只是为了完成初始化当前子类对象的父类型特征。所以严格意义上来说super 并不指向任何对象,super 只是代表了当前对象中的那部分父类型特征,单独输出 super,例如System.out.println(super);是无法编译的。

 

小结

通过本章节内容的学习,主要理解 super 代表什么,主要掌握 super 关键字的用法,例如在实例方法中super 怎么用,在构造方法中super 又应该怎么用。super this 可以对比学习。


最后附Java零基础视频教程给大家,配合学习效果更佳!!


Java零基础快速入门|Super(下)的评论 (共 条)

分享到微博请遵守国家法律