【Java】还不懂this关键字?一分钟彻底弄懂this关键字
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
- 博主简介努力学习的预备程序媛一枚~
- 博主主页 @是瑶瑶子啦
- 所属专栏: Java岛冒险记【从小白到大佬之路】
前言
问题为什么会存在this?
在上一篇【JavaSE】一文看懂构造器/构造方法Cunstructor中我们已经在构造器中初步窥得this关键字的冰山一角了。大家有没有考虑过在一个类的构造器中我们为什么要使用this.属性
而不直接使用属性
呢毕竟一个类中不管属性被什么关键字修饰在类中都可以访问。随着这个问题今天瑶瑶子带大家深入分析一下Java中this关键字,让大家彻底理解this关键字.
目录
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.属性
来表明这是一个成员变量与局部变量以示区分.
Part2this介绍
2.1this到底是什么
- 比较官方的解释
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–包
专栏系列文章
原创不易如果对你有所帮助还请三连+关注我是瑶瑶子持续输出优质文章