Java中的关键字this_super
文章目录
- 要点
- 错误的理解
- 正确的理解
- 演示代码
要点
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相关推荐
- 【Java_基础】Java中Native关键字的作用
本篇博文转载与:Java中Native关键字的作用 转载于:https://www.cnblogs.com/leiblog/p/10529056.html
- java中final关键字的使用
final 中文翻译为 最终的,在java中也是较为常用的关键字之一. 在java 中 final 关键字可以修饰 类.方法.变量 final 修饰在类上,则表示该类不能被继承,如果里面的成员变量没 ...
- java中的关键字static
原文链接: https://zhuanlan.zhihu.com/p/70110497 昨晚面试中被问到,没能回答出来.这篇答疑文章写得非常好,无一字可增删,遂直接复制. 在平时开发当中,我们经常会遇 ...
- java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题
先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...
- java transient_【转】Java中的关键字 transient
阅读目录 先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的 ...
- java中的关键字:this与super 大详解
文章目录 1.this 1.1. this是什么? 1.2 this调用对象中的属性.构造器和方法 2.super 2.1 super是什么? 2.2 super调用父类的属性.构造器.方法 3. t ...
- 4.Java中的关键字和标识符
关键字 1.被Java语言赋予特定含义的单词即为关键字,组成规则:字母全部都是小写 2. 保留字:即它们在Java现有版本中没有特殊含义,以后版本可能会作为有特殊含义的词,如 goto, con ...
- 3.Java中的关键字和注释
1.Java中的注释 注释: (1)提高程序的阅读性 (2) 调试程序 分类: (1) 单行注释 : //注释的文字 (2)多行注释: /*注释的文字*/ (3)文档注释: / ...
- 在java中使用关键字导入包_java中import关键字的使用方法
java中import关键字的使用方法 发布时间:2020-06-26 15:05:44 来源:亿速云 阅读:96 作者:Leah 这篇文章将为大家详细讲解有关java中import关键字的使用方法, ...
最新文章
- python通过什么来体现逻辑关系_Python语言通过()来体现语句之间的逻辑关系。
- python练习9-7
- 能源项目xml文件 -- app-context.xml
- 【转】VS TFS源码分析软件PATFS使用方法一:配置团队项目
- 装箱与拆箱 c# 1613534570
- java对焦_相机的对焦与合焦
- elementui el-radio-group 分组排序问题
- MT4API跟单软件详细分享
- 单片机是什么?51单片机和stm32有什么区别?
- python魔方程序算法_《Python基础教程》第9章 魔方方法、属性和迭代器
- ftp.proxy 代理服务器搭建
- 烽火2640路由器命令行手册-04-网络协议配置命令
- 地铁怎么坐才不能做反_[第一次]第一次一个人坐地铁,我坐反了方向
- js检测开发者工具是否打开 防止别人调试代码
- XX健康:移动端开发-体检预约验证码30秒倒计时短信验证码获取与验证DatePicker日历展示提交预约复杂流程阿里短信工具类
- JAVA大数据后台管理系统
- Linux中一句话反弹Shell细说
- Python习题答案
- dobot moveit 包_越疆科技dobot(magician)机械臂在ROS moveit下gazebo仿真控制和真实控制功能包 有兴趣的可以下载来玩...
- arcgis风向_ArcGIS教程:制作风或水流速流向图
热门文章
- aws 堆栈模板_使用Arquillian和LocalStack脱机测试AWS云堆栈
- 本地缓存防止缓存击穿_防止缓存爆炸的快速提示
- kata_FizzBu​​zz Kata与Java流
- java写入单个字符_将2个字符写入单个Java char
- javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!
- gui jfr_Java飞行记录器(JFR)
- 高效的企业测试-集成测试(3/6)
- Spring State Machine:它是什么,您需要它吗?
- xmx java_为什么我的Java进程比Xmx消耗更多的内存?
- lucene索引搜索_Lucene –快速添加索引和搜索功能