文章目录

  • 要点
  • 错误的理解
  • 正确的理解
    • 演示代码

要点

1.在类的构造器中,可以使用 this() 调用本类的其它构造器,调用的时候根据构造器声明的参数列表传递参数值

2.super() 调用父类的无参构造器

3.super.method() 调用父类的 method() 方法

4.super.name 访问父类的变量 name

5.使用 this()super() 调用构造器,必须写在构造方法体内,且必须写在第一个语句中

6.this()super() 不可以同时存在构造方法体内

错误的理解

1.this 表示当前对象

2.this 表示当前对象中的本类的资源

3.super 表示当前对象中继承自父类的资源

4.this 就是一个局部变量,保存当前对象的引用地址

正确的理解

1.this 表示本类的含义
2.super 表示父类的含义

演示代码

类 Ape:

package priv.lwx.javaprac.lambda;public class Ape {String bloodColor;String name;String skinColor;private int age;public String getBloodColor() {return bloodColor; // 会编译成Ape$bloodColor}public String getName() {return this.name; // 会编译成Ape$name}
}

类 Person:

package priv.lwx.javaprac.lambda;public class Person extends Ape {static String gender = "pp";
}

类 WhitePerson:

package priv.lwx.javaprac.lambda;public class WhitePerson extends Person {private int age;private String name;public WhitePerson() {}public WhitePerson(String name, int age, String bloodColor) {this.name = name;this.age = age;this.bloodColor = bloodColor;}public WhitePerson(String name, int age, String bloodColor, String skinColor,String gender) {this.age = age;this.name = name; // 会编译成WhitePerson$namethis.bloodColor = bloodColor; // 会编译成Ape$bloodColorsuper.skinColor = skinColor; // 会编译成Ape$skinColorthis.gender = gender; // 会编译成Person.gender}public WhitePerson(String name, int age, String bloodColor, String skinColor) {this.age = age;this.name = name;this.bloodColor = bloodColor; // 会编译成Ape$bloodColorsuper.skinColor = skinColor; // 会编译成Ape$skinColorthis.gender = gender; // 会编译成Person.gender,值为"pp"}public int getAge() {return age;}public String getBloodColor() {return this.bloodColor; // 会编译成 return Ape$bloodColor}}

演示类 Demo02WhitePerson:

package priv.lwx.javaprac.lambda;public class Demo02WhitePerson {public static void main(String[] args) {WhitePerson whitePerson1 = new WhitePerson("西太隆", 38, "red", "white");String gender = whitePerson1.gender; // 会编译成Person.genderSystem.out.println(gender); // 值为"pp"String name = whitePerson1.getName(); // whitePerson1对象中存在两个名为name的变量,分别是Ape$name、WhitePerson$name,方法getName返回的是当前对象中Ape$name的值System.out.println(name); // nullString bloodColor = whitePerson1.getBloodColor();System.out.println(bloodColor); // redWhitePerson whitePerson2 = new WhitePerson("喜太郎", 28, "blue", "yellow", "male");String gender1 = whitePerson2.gender; // 会编译成Person.genderSystem.out.println(gender1); // male}
}

举例说明:

假设构造方法中有这句代码 this.name = name,等号左边部分 this.name 在编译时,编译器会在本类 WhitePerson.java 中查找是否存在变量 name,如果存在还会继续判断是不是静态的变量,如果是静态的变量会编译成 WhitePerson.name 这样的语法格式;如果不是静态的变量,则会编译成 WhitePerson$name 这样的语法格式,表示这个变量 name 是来自于类 WhitePerson

如果本类 WhitePerson 中找不到变量 name,则会往上查找,如果找到顶层的父类还是找不到,则会报编译错误。假设在父类 Person 中找到了变量 name,同样会判断是不是静态的变量,如果是则会编译成 Person.name 这样的语法格式;如果不是静态的变量,则会编译成 Person$name 这样的语法格式,表示这个变量 name 是来自于类 Person

假设最后编译成 Person$name = name 这样的语法格式,那么在运行时,JVM 会去当前对象中查找来自于类 Person 的变量 name,再将参数 name 的值赋值给变量 Person$name

假设构造方法中有这句代码 super.name = name,等号左边部分 super.name 在编译时,编译器会在父类 Person.java 中查找是否存在变量 name,如果存在会继续判断是不是静态的变量,如果是静态的变量则会编译成 Person.name 这样的语法格式;如果不是静态的变量,则会编译成 Person$name 这样的语法格式,表示这个变量 name 是来自于类 Person

同样地,如果父类 Person 中找不到变量 name,也会往上查找,如果找到顶层的父类还是找不到,则会报编译错误。假设在 Person.java 的父类 Ape.java 中找到了变量 name,接着判断该变量是不是静态的,如果是静态的则会编译成 Ape.name;如果不是静态的,则会编译成 Ape$name,表示变量 name 来自于类 Ape

假设最后编译成 Ape$name = name 这样的语法格式,那么在运行时,JVM 会去当前对象中查找来自于类 Ape 的变量 name,再将参数 name 的值赋值给变量 Ape$name

Java中的关键字this_super相关推荐

  1. 【Java_基础】Java中Native关键字的作用

    本篇博文转载与:Java中Native关键字的作用 转载于:https://www.cnblogs.com/leiblog/p/10529056.html

  2. java中final关键字的使用

    final 中文翻译为 最终的,在java中也是较为常用的关键字之一. 在java 中 final 关键字可以修饰  类.方法.变量 final 修饰在类上,则表示该类不能被继承,如果里面的成员变量没 ...

  3. java中的关键字static

    原文链接: https://zhuanlan.zhihu.com/p/70110497 昨晚面试中被问到,没能回答出来.这篇答疑文章写得非常好,无一字可增删,遂直接复制. 在平时开发当中,我们经常会遇 ...

  4. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  5. java transient_【转】Java中的关键字 transient

    阅读目录 先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的 ...

  6. java中的关键字:this与super 大详解

    文章目录 1.this 1.1. this是什么? 1.2 this调用对象中的属性.构造器和方法 2.super 2.1 super是什么? 2.2 super调用父类的属性.构造器.方法 3. t ...

  7. 4.Java中的关键字和标识符

    关键字 1.被Java语言赋予特定含义的单词即为关键字,组成规则:字母全部都是小写   2. 保留字:即它们在Java现有版本中没有特殊含义,以后版本可能会作为有特殊含义的词,如 goto,  con ...

  8. 3.Java中的关键字和注释

    1.Java中的注释 注释: (1)提高程序的阅读性 (2) 调试程序 分类:   (1) 单行注释 :     //注释的文字 (2)多行注释:     /*注释的文字*/ (3)文档注释:   / ...

  9. 在java中使用关键字导入包_java中import关键字的使用方法

    java中import关键字的使用方法 发布时间:2020-06-26 15:05:44 来源:亿速云 阅读:96 作者:Leah 这篇文章将为大家详细讲解有关java中import关键字的使用方法, ...

最新文章

  1. python通过什么来体现逻辑关系_Python语言通过()来体现语句之间的逻辑关系。
  2. python练习9-7
  3. 能源项目xml文件 -- app-context.xml
  4. 【转】VS TFS源码分析软件PATFS使用方法一:配置团队项目
  5. 装箱与拆箱 c# 1613534570
  6. java对焦_相机的对焦与合焦
  7. elementui el-radio-group 分组排序问题
  8. MT4API跟单软件详细分享
  9. 单片机是什么?51单片机和stm32有什么区别?
  10. python魔方程序算法_《Python基础教程》第9章 魔方方法、属性和迭代器
  11. ftp.proxy 代理服务器搭建
  12. 烽火2640路由器命令行手册-04-网络协议配置命令
  13. 地铁怎么坐才不能做反_[第一次]第一次一个人坐地铁,我坐反了方向
  14. js检测开发者工具是否打开 防止别人调试代码
  15. XX健康:移动端开发-体检预约验证码30秒倒计时短信验证码获取与验证DatePicker日历展示提交预约复杂流程阿里短信工具类
  16. JAVA大数据后台管理系统
  17. Linux中一句话反弹Shell细说
  18. Python习题答案
  19. dobot moveit 包_越疆科技dobot(magician)机械臂在ROS moveit下gazebo仿真控制和真实控制功能包 有兴趣的可以下载来玩...
  20. arcgis风向_ArcGIS教程:制作风或水流速流向图

热门文章

  1. aws 堆栈模板_使用Arquillian和LocalStack脱机测试AWS云堆栈
  2. 本地缓存防止缓存击穿_防止缓存爆炸的快速提示
  3. kata_FizzBu​​zz Kata与Java流
  4. java写入单个字符_将2个字符写入单个Java char
  5. javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!
  6. gui jfr_Java飞行记录器(JFR)
  7. 高效的企业测试-集成测试(3/6)
  8. Spring State Machine:它是什么,您需要它吗?
  9. xmx java_为什么我的Java进程比Xmx消耗更多的内存?
  10. lucene索引搜索_Lucene –快速添加索引和搜索功能