Java中this关键字代表对当前对象的一个引用,this用来调用属性、方法以及本类中的构造方法。
下面我们通过几个例子来详述一下this的用法:
public class Student{
String name;
void doHomework(){
System.out.println(this.name+"正在做作业");
}
void speak(){
new Student().doHomework();//该行代码与this.doHomewor();有什么区别
System.out.println(name+"正在说话");
}
public static void main(String[] args){
Student student = new Student();
student.speak();
}
}
首先我们先看main方法中创建了一个新的Student类的对象,同时用该对象调用了speak方法;这时候我们再看speak方法,speak方法中又创建了一个新的对象,同时用这个在speak方法中新创建的对象对象调用了doHomework方法,如果speak方法中的new Student().doHomework换成this.doHomework,那么这里的this就代指调用speak方法的对象,即main方法中创建的对象。
第二个例子
public class Student{
String name;
void doHomework(){
System.out.println(this.name+"正在做作业");
}
public static void main(String[] args){
Student student = new Student();
student.name = "王五";
student.doHomework();//运行结果是什么
}
}
我们还是先看main方法,main方法中创建了一个新对象,并且给新对象的name属性赋值,同时用该对象调用了doHomework方法,再看doHomework方法,这里的this指调用该方法的对象,即main方法中创建的对象,该对象的name已经被赋值,所以这时name为王五,运行结果为:王五正在做作业
第三个例子
public class Student {
String name;
void doHomework(){
System.out.println(this.name+"正在做作业.......");
name="刘颖";
}
void speak(){
System.out.println(name+"正在说话......");
}
public static void main(String[] args) {
Student student = new Student();
student.doHomework();
student.speak();//运行结果是什么?如果把name = "刘颖"换成String name = "刘颖"呢
}
}
我们还是先看main方法,创建了一个新对象,并且用这个对象调用了两个方法,先调用doHomework方法;方法中先运行输出语句,这里this代指调用该方法的对象,此时对象的name属性还没有被赋值,所以String类型的全局变量默认为null,所以这里输出:null正在写作业…;输出之后给全局变量name赋值为刘颖
然后调用speak方法,这里输出语句的全局变量name已经被赋值为刘颖,所以输出刘颖正在说话…
如果将name = "刘颖"换成String name = “刘颖”,那么这时doHomework方法中定义了一个局部变量name为刘颖,其作用范围无法影响到speak方法,所以,此时speak方法中输出:null正在说话…
第四个例子
public class Student {
int age;
String name;
public Student(int age) {
this.age = age;
}
public Student(String name) {
this.name = name;
}
public Student(int age, String name) {
this(age);
new Student(name);//该行代码与this.name = name有什么区别
}
public static void main(String[] args) {
new Student(12, "王五");
}
}
先看main方法,通过构造方法创建一个新的对象,用的是第三个构造方法,此时第三个构造方法中this(age);调用本类中的第一个构造方法,this.age = age;this代指调用该方法的对象,即main方法中创建的对象,此时它的age属性为12,然后再看第三个构造方法中的第二行代码:new Student(name),这里又创建了一个新的对象,同时用该新创建的对象调用了第二个构造方法,所以这个新对象的name为王五,而main方法中创建的对象的name依然是null。
如果new Student(name)用this.name = name代替,则没有创建新对象,this代指main方法中创建的对象,这时main方法中创建的对象的name就是王五
第五个例子
public class Student {
String name;
public static void print() {
System.out.println(this.name);//这里的this会报错哦,你知道为什么吗
}
public static void main(String[] args) {
print();
}
}
这里报错的原因是,this关键字不能在static修饰的方法中使用,因为this代指的是对当前对象的一个引用,而static修饰的方法可以被类名调用而且推荐使用类名调用,this不能代指一个类,所以这里会报错。