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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/333368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Hibernate教程

1.简介 在本文中,我们将演示如何利用最流行的ORM(对象关系映射)工具之一的Hibernate的功能 ,该工具可将面向对象的域模型转换为传统的关系数据库。 Hibernate是目前最流行的Java框架之一。 由于这个原因,我们在Java Co…

百度地图瓦片 android,百度地图自定义瓦片图获取

nodejs代码const request require(request);const fs require(fs);const bagpipe require(bagpipe);const TileLnglatTransform require(tile-lnglat-transform);let [x1, y1] [72.26, 54.57]; // 起始点坐标(左上角)let [x2, y2] [137.31, 17.8]; // 终点坐标(右下角)le…

IntelliJ IDEA for Mac 如何自定义快捷键_设置快捷键

文章目录设置代码补全快捷键设置展开全部的快捷键折叠全部快捷键设置代码补全快捷键 代码自动补全,即智能提示。 打开【系统偏好设置】如下图所示: 在左侧的菜单栏中找到 Keymap → Main Menu → Code → Code Completion → Basic: 设…

android8 老手机,华为多款老旧手机获升安卓8.0,流畅度飙升!

原标题:华为多款老旧手机获升安卓8.0,流畅度飙升!一直以来,在手机用户圈都有这么一个共识,那就是安卓手机不如iPhone流畅,之前安卓手机给人的印象就是容易卡顿,而谷歌则一直在为此事苦恼&#x…

java12关键字var_Java 10:“ var”关键字

java12关键字varJava 10使用关键字var引入了局部变量类型推断 。 这意味着无需编写&#xff1a; Map<Department, List<Employee>> map new HashMap<>(); // ... for (Entry<Department, List<Employee>> dept : map.entrySet()) {List<Emp…

IntelliJ IDEA for Mac自定义动态代码模板快捷键(Live Templates Shortcut)

文章目录查看更多的快捷键常用的代码模板自定义代码模板快捷键格式化等号文档注释代码模板快捷键应用示例声明定义引用类型变量数组的 for 循环指定循环次数的 for 循环增强 for 循环倒序 for 循环自动生成普通 for 循环语句自动生成main 方法自动生成输出语句自动生成增强for循…

android udp 设备发现,两台Android设备之间进行UDP连接(使用多播地址)~~求大神指点...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼首先 发送端&#xff1a;package com.example.multicastclient;import android.support.v7.app.ActionBarActivity;import java.io.IOException;import java.net.DatagramPacket;import java.net.InetAddress;import java.net.Mult…

java serial_Java的@Serial批注

java serialJDK可能正在使用JDK 11 &#xff1a; Serial获得另一个标准&#xff08;预定义&#xff09;注释 。 JDK-8202385 [“标记与序列相关的字段和方法的注释”]的目的是添加“某种“ SerialRelated”注释&#xff0c;以促进对序列字段和方法的声明的自动检查。” 这种想法…

IntelliJ IDEA 选中变量名,高亮显示其它地方的这个变量名,高亮颜色如何设置呢?

选中了一个变量名&#xff0c;会高亮显示位于别的地方的这个变量名&#xff0c;那么怎么修改其他地方的高亮颜色&#xff1f; 按下 Command , 打开偏好设置窗口&#xff0c;接着看下图&#xff1a;

rest和rest ful_还有更多REST技巧

rest和rest ful在以前的博客文章中&#xff0c;我介绍了一些实现REST体系结构的想法和技巧。 在这篇文章中&#xff0c;我将介绍更多的想法和技巧。 快取 缓存是原始论文的很大一部分。 见5.1.4节 策略包括验证&#xff08; 客户端检查它是否具有最新版本 &#xff09;和过期…

html实心圆点特殊符号,和平精英名称添加圆点符号的方法 和平精英圆点符号代码分享...

和平精英怎么在名字中添加圆点符号呢&#xff1f;昵称中是可以加入圆点符号的&#xff0c;很多小伙伴们都想要一个性一点的名字&#xff0c;那么就可以用到各种各样的特殊符号&#xff0c;圆点符号复制的代码小编已经分享到下面了&#xff0c;有需要这个圆点符号的玩家快带走吧…

Java包装类和基本数据类型的对照

int --> Integer byte --> Byte short --> Short long --> Long boolean --> Boolean char --> Character double --> Double float --> Float 注&#xff1a;基本类型自动转换成对应的包装类型&#xff0c;叫自动装箱&#xff1b;包装类型转换成对应…

java 8 stream_Java 8 Stream示例

java 8 stream这篇文章将帮助您了解Java 8中一些重要且经常使用的Stream操作&#xff0c;这使您使用Java编程变得容易。 让我们以传统示例为例&#xff0c;“员工和部门”。 public class Employee {private String name;private Integer age;private String city;private De…

html怎么设置图片隐藏,css3如何隐藏图片?

css3隐藏图片的方法&#xff1a;1、为图片元素设置display:none;样式来隐藏。2、使用visibility:hidden;样式隐藏图片。3、使用opacity:0;样式通过设置图片完全透明来设置图片不可见。css中可以使用下面几种样式隐藏图片&#xff1a;display:none;visibility:hidden;opacity:0;…

IntelliJ IDEA修改项目的根目录名称_修改包目录的名称_修改模块名称_修改项目名称

文章目录修改项目根目录的名称修改包目录的名称模块重命名修改了项目根目录后&#xff0c;必须删除项目和 .idea 文件&#xff0c;重新导入&#xff08;重点&#xff09;新版本的 IDEA 取消了 Import Project 入口修改项目根目录的名称 如果仅仅修改项目的名称&#xff0c;而不…

容器rocker_用Rocker制作模板

容器rocker在本文中&#xff0c;我们将快速介绍Rocker &#xff0c;这是一个静态类型化的快速Java 8模板引擎。 必需的依赖项 要开始使用Rocker&#xff0c;我们需要在项目中添加以下依赖项&#xff1a; <dependency><groupId>com.fizzed</groupId><art…

android 开源 示波器,上个老外的开源虚拟示波器

这个老贵~&#xff01;Price USD (US Dollar) $ 1595.00Network BitScope 442 ( BS442N )(原文件名:bs445n.png)(原文件名:bs440e.jpg)BS442NBS325NBS325UBS100UBS50UThe correct appearance of this website is only visible in graphical browsers that support web standard…

Java子类的成员方法可以直接调用父类的成员方法和成员变量

public class Teacher extends Employee {public static void main(String[] args) {}public void method() {super.method(); // 可以直接调父类的成员方法super.name; // 访问父类的成员变量System.out.println("子类方法执行&#xff01;");} }我的理解&#xff1…

java类似sizeof_如何用Java编写类似C的Sizeof函数

java类似sizeof如果您刚开始学习Java并且是C语言背景&#xff0c;那么您可能已经注意到Java和C编程语言之间存在一些差异&#xff0c;例如String是Java中的对象&#xff0c;而不是NULL终止的字符数组。 同样&#xff0c;Java中没有sizeof&#xff08;&#xff09;运算符。 所有…

html文件压缩成gzip,前端性能优化成神之路-HTTP压缩开启gzip

什么是HTTP压缩cssHTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。 HTTP采用通用的压缩算法&#xff0c;好比gzip来压缩HTML,Javascript, CSS文件。 能大大减小网络传输的数据量&#xff0c;提升了用户显示网页的速度。固然&#xff0c;同时会增长一点点服…