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

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


运行结果如下图所示:

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


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

运行结果如下图所示:

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


通过以上内存图可以清楚的看到,父类 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零基础视频教程给大家,配合学习效果更佳!!

