this
this是什么
- this作为一个变量,可以用在方法中,可以来获取当前对象的地址。
例如现在有一个学生类:
public class Student(){ //该学生类中定义了一个方法,用来输出this public void printThis(){ System.out.println(this); } }
然后我们创建一个学生对象s1和s2,并尝试输出这个学生对象的this变量
public class Test{ public static void main(String[] args){ Student s1 = new Student(); System.out.println(s1); s1.printThis(); Student s2 = new Student(); System.out.println(s2); s1.printThis(); } }
运行之后就会得到两对结果相同的地址值,例如:
包名.类名.对象名@776ec8df
包名.类名.对象名@776ec8df
com.user.thisdemo.Student@4eec7777
com.user.thisdemo.Student@4eec7777
this的执行原理
首先会先加载Test类到方法区里来执行,然后把Test类里面的main方法提取到栈里面来执行
接着执行main方法里的第一行代码,这行代码会把这个学生类也加载到方法区里面去执行
然后通过这个学生类创建一个学生对象s1 ,这个方法一执行完,在栈中就会有一个s1变量去指向一个新的学生对象,新的学生对象可以找到定义它的学生类
新的学生对象就可以找到学生类,代码里输出的s1,输出的就是这个新的学生对象的地址
这行代码用s1去调用printThis方法,它通过s1找到这个学生对象,然后通过这个学生对象去调用printThis方法
当这个学生对象调用这个方法的时候,它会把自己对象的地址传给这个方法里面的this接收,因此此时这个方法输出的this变量就是这个学生变量的地址
this的应用场景
- this主要用来解决:变量名称冲突问题的。
例如现在我们想在学生类中定义一个比较考试分数的方法:
public class Student{ double score; public void printPass(double score){ //假设恰好变量名称重复了 if(score > score){ System.out.println("......"); }else{ System.out.println("......"); } //这样就会产生冲突 } }
使用this关键字:
public class Student{ double score; public void printPass(double score){ //使用this关键字 if(this.score > score){ System.out.println("......"); }else{ System.out.println("......"); } //这样就可以避免冲突,当然,也可以改变方法内部的变量名称, //如: public void printPass(double score1) } }
方法里的this是如何拿到调用它的对象的?
实际上,编译器在编译时,会给方法加一个参数,这个参数就是this,也就是用来接收当前对象的地址的
public void printThis(Student this){ System.out.println(this); }
构造器
构造器是什么
- 构造器可以说是一个特殊的方法,它也可以重载;分为无参数构造器和有参数构造器。
它的方法名必须与类名一致,且不用写明是何返回类型,结构为:
public class Student{
// 构造器
public Student(){
...
...
}
}
构造器的特点
- 创建对象时,对象会去调用构造器。
Student s = new Student();
应用场景
- 创建对象时,同时完成对对象成员变量(属性)的初始化赋值
public class Student{ String name; double score; public Student(){ } public Student(String name,double score){ this.name = name; this.score = score; } }
public class Test{ public static void main(String[] args){ Student s1 = new Student(); s1.name = "张三"; s1.score = 100; //可以写成这样直接给成员变量赋值 Student s2 = new Student("李四",59); } }
注意事项
- 类在设计时,如果不写构造器,Java是会为类自动生成一个无参构造器的。
- 一旦定义了有参数构造器,Java就不会帮我们的类自动生成无参构造器了,此时就建议自己手写一个无参数构造器出来了。
END