一、super关键字

在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。

class Student {

public int age;

public void std(){ //声明Student类的方法std()

age = 15;

System.out.println("学生平均年龄为:"+age);

}

}

class ThisStudent extends Student{

public int age;

public void std(){

super.std(); //使用super作为父类对象的引用对象来调用父类对象里面的Std()方法

age = 18;

System.out.println("这个学生的年龄为:"+age);

System.out.println(super.age); //使用super作为父类对象的引用对象来调用父类对象中的age值

System.out.println(age);

}

}

public class TestDif {

public static void main(String[] args) {

ThisStudent a = new ThisStudent();

a.std();

}

}

执行结果:

学生平均年龄为:15

这个学生的年龄为:18

15

18

二、上述程序的内存分析

ThisStudent a = new ThisStudent();

程序执行到这里时,首先在栈空间里面会产生一个变量a,a里面的值是什么这不好说,总而言之,通过这个值我们可以找到new出来的ThisStudent对象。由于子类ThisStudent是从父类Student继承下来的,所以当我们new一个子类对象的时候,这个子类对象里面会包含有一个父类对象,而这个父类对象拥有他自身的属性age。这个age成员变量在Student类里面声明的时候并没有对他进行初始化,所以系统默认给它初始化为0,成员变量(在类里面声明)在声明时可以不给它初始化,编译器会自动给这个成员变量初始化,但局部变量(在方法里面声明)在声明时一定要给它初始化,因为编译器不会自动给局部变量初始化,任何变量在使用之前必须对它进行初始化。

子类在继承父类age属性的同时,自己也单独定义了一个age属性,所以当我们new出一个子类对象的时候,这个对象会有两个age属性,一个是从父类继承下来的age,另一个是自己的age。在子类里定义的成员变量age在声明时也没有给它初始化,所以编译器默认给它初始化为0。因此,执行完第一句话以后,系统内存的布局如下图所示:

a.std();

当new一个对象出来的时候,这个对象会产生一个this的引用,这个this引用指向对象自身。如果new出来的对象是一个子类对象的话,那么这个子类对象里面还会有一个super引用,这个super指向当前对象里面的父对象。所以相当于程序里面有一个this,this指向对象自己,还有一个super,super指向当前对象里面的父对象。

这里调用重写之后的std()方法,方法体内的第一句话:“super.std();”是让这个子类对象里面的父对象自己调用自己的f()方法去改变自己age属性的值,父对象通过指向他的引用super来调用自己的std()方法,所以执行完这一句以后,父对象里面的age的值变成了15。接着执行“age=18;”这里的age是子类对象自己声明的value,不是从父类继承下来的那个age。所以这句话执行完毕后,子类对象自己本身的age值变成了18。此时的内存布局如下图所示:

方法体内的最后三句话都是执行打印age值的命令,前两句打印出来的是子类对象自己的那个age值,因此打印出来的结果为18,最后一句话打印的是这个子类对象里面的父类对象自己的age值,打印出来的结果为15。

到此,整个内存分析就结束了,最终内存显示的结果如上面所示。

(参考自孤傲苍狼)

java中super关键字_Java中关键字super与this的区别相关推荐

  1. java outer关键字_java中的关键字

    abstract : 表明类或者成员方法具有抽象属性 assert : 断言,用来进行程序调试 boolean :基本数据类型之一,声明布尔类型的关键字 break :提前跳出一个块 byte :基本 ...

  2. java中关键字_java中的关键字是什么?

    展开全部 访问控制: private 私有的 protected 受保护的 public 公共的 类.方法和变量修饰符 abstract 声明抽象 class 类 extends 扩允,继承 fina ...

  3. 什么是java的关键字_java中常见的关键字

    什么是关键字呢? 概述:关键字就是在java语言中赋予特殊含义的单词 特点:1.组成的关键字的单词全是小写 2.常见的代码编辑器中,对关键字都有特殊的颜色标记 比如在idea中对关键字都有特殊的颜色标 ...

  4. java同步关键字_Java中synchronized关键字修饰方法同步的用法详解

    Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有 ...

  5. java中常用的关键字_java中的常用的关键字

    在java编程过程中,会经常写到一些关键字,但是对于他们应用的方式其实一直是模仿状态,并没有很实质的去了解,为什么要这么用,导致程序不能优化,或者出现了bug不明所以,因而再详细的去重温了一下各种了解 ...

  6. java 中特殊的_Java中一些特殊关键字

    transient 被transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后, transient 变量的值被设为初始值, 如 int 型的是 0,对象型的是 null. ins ...

  7. java中用于定义小数的关键字_Java 中用于定义小数的关键字有两个:( ) 和 ( )。_学小易找答案...

    [填空题]列举至少三种中药饮片现代贮藏方法 [单选题]用于薄壁形零件联接时,应采用 . [填空题]若螺纹的直径和螺纹副的摩擦系数一定, 则拧紧螺母时的效率取决于螺纹的 和 . [单选题]以太网采用的介 ...

  8. java异常类关键字_Java中的异常处理关键字是什么?

    java异常处理中使用了四个关键字. throw:有时我们明确要创建异常对象然后抛出它来停止程序的正常处理.throw关键字用于向运行时抛出异常来处理它. throws:当我们在方法中抛出任何已检查的 ...

  9. java transient 关键字_java中的transient关键字详解

    前言 说实话学了一段时间java的朋友对于transient这个关键字依旧很陌生基本没怎么用过,但是transient关键字在java中却起到了不可或缺的地位!如果要说讲到,我觉得最可能出现的地方是I ...

  10. java引用类的关键字_java中定义类通常使用的关键字有哪些

    下面四种 1) private 类中限定为private的成员,只能被这个类本身访问. 如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例. 2) default 类中不加任何访 ...

最新文章

  1. NC:港大张彤团队-基于组学的耐药基因风险评估框架
  2. jquery实现层级显示 效果图_php运用无限级分类实现评论及回复功能
  3. spring beans源码解读之--XmlBeanFactory
  4. 「后端小伙伴来学前端了」Vue中 this.$set的用法 | 可用于修改对象中数组的某一个对象、 可用于更新数据到视图
  5. android SharedPreferences的使用优化
  6. Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程
  7. Cppunit 源码 SynchronizedObject
  8. JavaScript运算符的优先级(案例讲解)
  9. JS与Jquery学习笔记(二)
  10. alsa的动态库安装在哪里_源码编译安装MySQL8.0.20
  11. 开源磁盘加密软件VeraCrypt教程
  12. 二维傅立叶变换和二维傅立叶反变换
  13. php选课删除选课成绩统计,高校选修课平时成绩管理系统
  14. orbslam 2 运行 tum 数据集中的 walking xyz 序列
  15. l麒麟安装oracle,中标麒麟linux安装Oracle客户端
  16. python实例100例百度文库-18个Python爬虫实战案例(已开源)
  17. JDK 17:Java 17 中的新特性
  18. ArcGIS数据管理
  19. via和pad的区别
  20. Python for Maya DCC工具插件开发学习记录(一)

热门文章

  1. laravel 目录
  2. 广域网之间是通过路由器互联吗?—Vecloud
  3. 如何查看静态库和动态库是32位还是64位
  4. 分区脚本(fdisk)
  5. 51nod 1087 1 10 100 1000
  6. Chapter34 创建主窗口/实现应用程序功能
  7. 使用泛型 ,做计算器
  8. Network simulation using OPNET
  9. (转帖)eclipse 下 搭建 django开发环境
  10. 用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。