this关键字
先看一段代码,并分析问题
public class This {
public static void main(String[] args) {
Dog01 dog1 = new Dog01("brave",3);
dog1.info();
}
}
class Dog01{ //类
String name;
int age;
//此时我们将构造器的参数改成了和属性变量一样的名称
//就会出现一个问题,即根据变量的作用域规则
//构造器的name age就是局部变量,而不是属性,因此我们传参进入的值不会在info方法中打印出来
//引出this关键字来解决
public Dog01(String name,int age){//构造器
name = name;
age = age;
}
public void info(){//成员方法,输出属性信息
System.out.println(name + "\t" + age + "\t");
}
}
问题:构造方法的输入参数名不是非常的好,如果能够将dName改成name就好了,但是我们 会发现按照变量的作用域原则,name的值就是nul,怎么解决->this
什么是this?
java虚拟机会给每个对象分配this,代表当前对象。坦白的讲,要明白this不 是件容易的事,我给大家打一个比方。[上帝创世界小故事]
使用this解决前面变量命名问题
具体看代码
this.name = name;
this.age = age;
//this.name/age表示当前对象的属性,而不是局部变量了
需要注意的是 ,不同的类的this代表不同类对象的属性
this的注意事项和使用细节
ThisDetail.java
1.this关键字可以用来访问本类的属性、方法、构造器
2.this用于区分当前类的属性和局部变量
3.访问成员方法的语法:this.方法名(参数列表)
4.访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造器中调用另外一个构造器 ,必须放到第一条语句)
5.this不能在类定义的外部使用,只能在类定义的方法中使用。
public class ThisDetail {
public static void main(String[] args) {
T t1 = new T();
t1.f2();
T t2 = new T();
}
}
class T{
//细节:访问成员方法的语法:this.方法名(参数列表);
public void f1(){
System.out.println("f1()方法...");
}
public void f2(){
System.out.println("f2()方法...");
//调用本类的f1
//第一种方式
f1();
//第二种方式
this.f1();
}
public T(){
this("jack",20);
//2.使用this方法传入对应的参数即可实现
//注意:如果有构造器的this方法必须要放置到首个语句
System.out.println("T()构造器");
//1.这里如果想要访问到public T(String name,int age)构造器
}
public T(String name,int age){
System.out.println("T(String name,int age)构造器");
}
}
再来看看这个代码
public void f3(){
String name = "smith";
//传统方式
System.out.println("名字为"+name+"年龄为"+age);
//使用this访问本类的属性
System.out.println("名字为"+this.name+"年龄为"+this.age);
}
当调用到f3这个方法的时候就会发现打印年龄的时候 ,二者输出的年龄都是类的属性 年龄
但是一旦输出名字就会发现传统方式的式"smith" ,这是因为传统方式采用的是"就近原则"即使用最近作作用域的变量 ,而this不同 ,采用的就只能是类中的属性
●this的课堂案例
TestPerson.java
定义Person类,里面有name、age属性,并提供compareTo比较方法,用于判断是否和另一个人相等,提供测试类TestPerson用于测试,名字和年龄完全一样,就返回true, 否则返回false
public class TestPerson {
public static void main(String[] args) {
Personz z1 = new Personz("mike",20);
Personz z2 = new Personz("mike",20);
System.out.println(z1.compareTo(z2));
//此时传参的对象就为z2,z1对象和z2对象的属性进行对比
}
}
class Personz{
//创建一个Personz类
String name;
int age;
//创建类的属性
public Personz(String name,int age){
this.name = name;
this.age = age;
//创建类的构造器,添加this用于区分属性和传进来的形参
}
public boolean compareTo(Personz p){
//返回类型位Boolean,传入的参数为一个Person对象
// if (this.name.equals(p.name) && this.age == p.age){
//判断当前的对象的name和传入的p对象的name
//并且age也是一致的
// return true;
// }else {
// return false;
// }
return this.name.equals(p.name) && this.age == p.age;
//将上面的判断语句合称为一句
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)