【Java】还不懂this关键字?一分钟彻底弄懂this关键字

news2024/12/30 3:14:51

在这里插入图片描述

  • 博主简介:努力学习的预备程序媛一枚~
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: Java岛冒险记【从小白到大佬之路】

在这里插入图片描述

前言

问题:为什么会存在this?
在上一篇【JavaSE】一文看懂构造器/构造方法(Cunstructor)中,我们已经在构造器中初步窥得this关键字的冰山一角了。大家有没有考虑过,在一个类的构造器中,我们为什么要使用this.属性而不直接使用属性呢?毕竟一个类中,不管属性被什么关键字修饰,在类中都可以访问。随着这个问题,今天瑶瑶子带大家深入分析一下Java中this关键字,让大家彻底理解this关键字.


目录

  • 前言
  • Part1:构造器中的this
    • 1.1初识this:
    • 1.2:为何要this?
  • Part2:this介绍
    • 2.1:this到底是什么?
  • Part3:使用细节&注意事项

Part1:构造器中的this

1.1初识this:

public class Account {
    private String name;
    private double balance;
    private String pwd;
	
	//Account类的一个构造器
	public Account (String name,double balance,String pwd){
		//构造器的实现---初始化对象
		this.name = name;
		this.balance = balance;	
		this.pwd = pwd;
	}
}
  • 【思考】:不用this会怎么样?
class Account {
    private String name;
    private double balance;
    private String pwd;

    //Account类的一个构造器
    public Account(String name, double balance, String pwd) {
        //构造器的实现---初始化对象
        //不用this
        name = name;
        balance = balance;
        pwd = pwd;
    }

    public void showInfo() {
        System.out.println("name:" + name + " " + "balance:" + balance + " " + "pwd:" + pwd);
        return;
    }
}

public class Main {
    public static void main(String[] args) {
        Account account = new Account("Yaoyao", 20, "123456");
        account.showInfo();
    }
}
  • 【运行结果】:在这里插入图片描述

  • 【解释】:

    • 我们以为左边的变量是成员变量,但实际上,左边变量是局部变量!即,局部变量赋值给了局部变量,成员变量根本没变,依旧是默认值!
      在这里插入图片描述

    • 方法中的变量为局部变量,存储在中,作用范围是方法内;我们想通过构造器初始化的是成员变量,存储在中,作用范围是本类内部
      当成员变量&局部变量重名时,优先使用局部变量
      关键还是看有没有局部变量,有局部变量优先使用局部变量,否则属性—就近原则!

在这里插入图片描述

1.2:为何要this?

 通过上面的分析,我们发现,当局部变量&属性同名时,在构造器中无法对属性初始化成功。我们在想,如果能被赋值的变量,不是构造器中的局部变量,而是成员变量这个问题不就解决了嘛?对的,所以就有了this!!!

public class Account {
    private String name;
    private double balance;
    private String pwd;
	
	//Account类的一个构造器
	public Account (String name,double balance,String pwd){
		//构造器的实现---初始化对象
		this.name = name;
		this.balance = balance;	
		this.pwd = pwd;
	}
}

 这样,通过this.属性来表明这是一个成员变量,与局部变量以示区分.

Part2:this介绍

2.1:this到底是什么?

  • 比较官方的解释:

Java虚拟机(JVM)会给每个对象分配一个this,来代表当前对象,

  看到这句话真的就很烦,好像是这么回事对吧。但又感觉说的不是很通俗。瑶瑶子来说人话!

说人话解释:

  • this其实可以理解为对象的一个属性(成员变量),但是这个属性是隐藏的.即this相当于对象的一个隐藏属性。
  • 和对象的其他属性一样,在new一个新对象的时候,会在堆内存为对象分配空间,属性就储存在这份空间中。且该this属性的值就是对象在堆内存中地址,即this指向该对象(this代表该对象).

【重点】综上:this是对象的隐藏属性(本质就是一个普通的成员变量),和其他non-static属性一样,在创建对象的时候会为每个新对象分配该对象的专属成员变量(this就是其中一个),this这个成员变量存储在堆内存中,该变量的值是所属对象在堆内存的地址。

即:创建1000个对象,就有1000个this,它们之间相互独立(哎呀,this就是普通的成员变量而已啦!)

  • 【图解】:
    在这里插入图片描述

Part3:使用细节&注意事项

  • this关键字可以用来区分当前类的属性&局部变量。
  • 使用this关键字可以用来访问本类的实例属性、实例方法、构造器(“实例”指的就是non-static修饰 的)
    • 访问本类实例属性:this.属性
    • 访问本类实例方法:this.方法名(参数列表)
    • 访问本类构造器:this(参数列表)
  • 【注意】:this(参数列表)来访问本类构造器需要注意以下几点
    • 只能在构造器中使用this(参数列表);即在一个构造器中访问本类的另外一个构造器。(默认构造器行首是super();,)。
    • 显示使用this()时,默认的super()就被覆盖
    • this(参数列表)super(参数列表)在构造器中有且只能存在一个。
    • 若在构造器中使用this(参数列表),则此语句只能位于构造器第一行
    • 类中的静态方法static method不能使用this很简单理解:static方法中不能出现成员变量(this依赖对象,而static不依赖于对象,类名.静态方法时,没有对象啊,你让this情何以堪!它都不知道自己属于哪个对象!)在【JavaSE】保姆级教程|1万字+10张图学会类与对象–建议收藏这篇博文的Part4、Part5部分关于成员方法和静态方法已经做出详细解释
//错误代码:
public class Account {
    private String name;
    private double balance;
    private String pwd;
	
	public static void show(){
		System.out.print(name);//编译出错:实例变量依赖于对象
		System.out.print(this.name);//编译出错,this.name依赖对象
	}
}
  • 一个笨笨的解决方法哈哈:既然需要对象,那我就new一个呗哈哈,这样实例变量、方法都有所归属啦~
public class Account {
    private String name;
    private double balance;
    private String pwd;
	
	public static void show(){
		Account account = new Account();//创建对象
		System.out.print(account.name);
	}
}

下期预告–详细讲解Java–包
专栏系列文章:

  • 【JavaSE】一文看懂构造器/构造方法(Cunstructor)
  • 【JavaSE】保姆级教程|1万字+10张图学会类与对象–建议收藏
  • 【JavaSE】多图解,保姆级详细讲解数组、二维数组–建议收藏

原创不易,如果对你有所帮助,还请三连+关注!我是瑶瑶子,持续输出优质文章!

在这里插入图片描述

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

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

相关文章

更方便Spring存储和读取对象,五大类注解、@Bean、@Autowired、@Resource

上一篇博客我们介绍了如何使用xml来引入bean对象,当项目多的时候,显然那样是比较麻烦的。现在我们只需要 个注解就可以替代了。注意:注解和xml可以同时使用准备工作:配置扫描路径我们需要配置 下存储对象的扫描包路径,只有被配置的…

利用Windows系统服务进行权限提升

提权是后渗透重要的一环节,如果当前获取的用户权限比较低,那么我们将无法访问受保护的系统资源或执行系统管理操作,影响后续的攻击过程。这要求我们通过各种手段将当前用户的权限进行提升,以满足后续攻击的要求。利用系统服务提权…

VUE2--22.11.23

VUE2一、Vue.js devtools二、Vue简介1、什么是Vue2、Vue的特性1.数据驱动视图2.双向数据绑定3.MVVM三、Vue的基本使用1、基本使用步骤四、Vue的指令与过滤器1、什么是指令2、内容渲染指令1.v-text2.{{}}3.v-html3、属性绑定指令4、事件绑定指令5、双向绑定指令6、条件渲染指令7…

【Linux】动静态库、文件的三个时间

1.文件的三个时间Access: 访问时间,访问的频率很高,所以较新的Linux都是按一定的时间间隔刷新Modify: 修改文件内容时间Change:修改文件属性时间,修改文件内容也会修改文件属性makefile自动编译判断文件是否为最新:就是按可执行程…

运动基元(一):Dubin‘s曲线【part3】

3.5 RLR RLR的第一段圆弧的曲率 k 1 = − k m a x < 0 → s i g n ( k 1 ) = − 1 k_1=-k_{max}<0\rightarrow si

Springboot图书馆图书借阅管理系统x1x74

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 2.1 java简介 3 2.2 Mysql数据库 3 2.3 B/S结构 4 2.4 JSP技术介绍 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2操作…

机器学习sklearn笔记:LDA(线性判别分析)

1 介绍 1.有监督的降维2.投影后类内方差最小&#xff0c;类间方差最大2 推导 我们记最佳的投影向量为w&#xff0c;那么一个样例x到方向向量w上的投影可以表示为&#xff1a; 给定数据集令分别表示第i类的样本个数、样本集合、均值向量和协方差矩阵——>在投影上的均值是 —…

kafka初识

安装kafka 下载 下载window的kafka地址 window的kafka只是为了方便学习 安装地址&#xff1a;kafka.apache.org/ 安装 解压zip为文件夹 启动kafka kafka服务器的功能相当于RocketMQ中的broker&#xff0c;kafka运行还需要一个类似于命名服务器的服务。在kafka安装目录中自…

Windows10添加WebDav地址时报错“输入的文件夹无效,请选择另一个”

一、问题描述在使用Windows10添加WebDav网络地址时&#xff0c;报错“输入的文件夹无效&#xff0c;请选择另一个”&#xff0c;如下图所示&#xff1a;二、问题分析这是由于Windows10的WebDav默认只支持https协议&#xff0c;没有支持http协议导致的。三、解决办法3.1、修改注…

计算机科学领域中里程牌式的算法

计算机科学中伟大的算法前言搜索引擎的索引PageRank公钥加密 --- 用明信片传输秘密纠错码数据压缩无损压缩有损压缩数据库 --- 追求一致性的历程事务和待办事项&#xff08;预写日志记录&#xff09;数字签名用挂锁签名用指数挂锁签名RSA的安全性前言 我肯定不是一位天文学专家…

redis 消息队列方案

redis 消息队列方案 观察角度&#xff1a;消息有序&#xff0c;重复消息处理&#xff0c;消息可靠性保证 pub/sub 发布订阅机制 list集合 消息有序&#xff1a;lpush和rpop可以保证消息顺序的被消费 重复消息处理&#xff1a;list没有为消息提供唯一标识&#xff0c;需要生产者…

利用matlab求解非线性目标函数

文章目录函数介绍设置函数参数步骤结果分析函数介绍 使用fmincon函数来进行求解&#xff0c;格式为 [x,y] fmincon(f,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)其中&#xff0c;f表示所求的目标函数&#xff0c;x0表示初始值&#xff0c;A,b,Aeq,beq表示线性的约束&#xff0c…

SpringBoot06:整合JDBC、Druid、MyBatis

整合JDBC 1、创建一个新的工程&#xff0c;勾选JDBC API和MySQL Driver 2、导入web启动器 3、编写yaml配置文件&#xff0c;连接数据库 spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/mybatis?useUnicodetrue&characterEncodingut…

力扣 2299. 强密码检验器 II

题目 如果一个密码满足以下所有条件&#xff0c;我们称它是一个 强 密码&#xff1a; 它有至少 8 个字符。 至少包含 一个小写英文 字母。 至少包含 一个大写英文 字母。 至少包含 一个数字 。 至少包含 一个特殊字符 。特殊字符为&#xff1a;“!#$%^&*()-” 中的一个。…

面向对象编程范式

目录 1.概述 1.1.面向对象编程的核心诉求 1.2.面向对象的世界观 2.类和对象 3.如何寻找类和对象 3.1.概述 3.2.示例 4.如何表示类 4.1.什么是UML 4.1.关系 4.2.权限 4.3.依赖 4.4.泛化&#xff08;继承&#xff09; 4.5.实现 4.6.关联 4.7.聚合 4.8.组合 1.概…

自定义类型之枚举和联合

该文章将详细介绍除结构体外的另外两种自定义类型--------枚举类型与联合类型。1.枚举1.1枚举类型的定义1.2枚举的优点1.3枚举的使用2.联合&#xff08;共用体&#xff09;2.1联合类型的定义2.2联合的特点2.3联合大小的计算1.枚举 枚举顾名思义就是------一一列举。 把所有可能…

ADAS HiL系统测试方案

1、什么是ADAS ADAS&#xff08;Advanced Driving Assistance System&#xff09;也就是高级驾驶辅助系统&#xff0c;是无人驾驶的过渡。 ADAS利用安装在车上的各式各样传感器&#xff08;毫米波雷达、激光雷达、单\双目摄像头以及卫星导航&#xff09;&#xff0c;在汽车行驶…

[前端笔记——CSS] 12.处理不同方向文本

[前端笔记——CSS] 12.盒模型背景与边框1.书写模式2.书写模式、块级布局和内敛布局3.逻辑属性和逻辑值1.书写模式 CSS 中的书写模式是指文本的排列方向是横向还是纵向的。writing-mode 属性使我们从一种模式切换到另一种模式。例如&#xff0c;我们使用writing-mode: vertical…

stack、queue、priority_queue

容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff0c;该种模式是将一个类的接口转换成客户希望的另外一个接口。 其中stack和queue都是容器适配器&#xff0c;其中stack可以封装vector、list以及我们…

ffmpeg无损裁剪、合并视频

我用的版本是 ffmpeg version git-2020-06-23-ce297b4 官方文档 https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax 时间格式 [-][HH:]MM:SS[.m...] 或 [-]S[.m...][s|ms|us]裁剪视频 假设需要裁剪视频aaa.mp4&#xff0c;第5秒到第15秒 ffmpeg -ss 5 -to 15 -i…