Java this关键字
java this关键字可以有很多用法。在Java中,这是引用当前对象的引用变量。
1 Java this关键字的用法
Java this关键字有6种用法:
- this引用当前类的实例变量
- this调用当前类的方法
- this()调用当前类的构造方法
- this作为普通方法调用的参数
- this作为构造方法调用的参数
- this从方法返回当前类的实例
建议:如果你是Java的初学者,则重点掌握this关键字的前三种用法。
2 this引用当前类的实例变量
this关键字可用于引用当前的类实例变量。如果实例变量和参数之间存在歧义,则使用this关键字可解决歧义问题。
2.1 不使用this关键字的情况
先看看以下示例在没有使用this关键字的情况下会产生什么问题:
/**
* 一点教程网 - http://www.yiidian.com
*/
//没有使用this关键字的情况
class Student{
int rollno;
String name;
float fee;
Student(int rollno,String name,float fee){
rollno=rollno;
name=name;
fee=fee;
}
void display(){
System.out.println(rollno+" "+name+" "+fee);
}
}
class TestThis1{
public static void main(String args[]){
Student s1=new Student(111,"张三",5000f);
Student s2=new Student(112,"李四",6000f);
s1.display();
s2.display();
}
}
输出结果为:
0 null 0.0
0 null 0.0
在上面的示例中,参数(形式参数)和实例变量相同。因此,我们使用this关键字来区分局部变量和实例变量。
2.2 使用this关键字解决问题
/**
* 一点教程网 - http://www.yiidian.com
*/
//使用this关键字解决问题
class Student{
int rollno;
String name;
float fee;
Student(int rollno,String name,float fee){
this.rollno=rollno;
this.name=name;
this.fee=fee;
}
void display(){
System.out.println(rollno+" "+name+" "+fee);
}
}
class TestThis2{
public static void main(String args[]){
Student s1=new Student(111,"张三",5000f);
Student s2=new Student(112,"李四",6000f);
s1.display();
s2.display();
}
}
输出结果为:
111 张三 5000.0
112 李四 6000.0
如果局部变量(形式参数)和实例变量不同,像下面示例一样,则无需this关键字区分:
2.3 不需要this关键字的情况
/**
* 一点教程网 - http://www.yiidian.com
*/
//如果参数和实例变量名称不同,则无需使用this关键字
class Student{
int rollno;
String name;
float fee;
Student(int rollno,String name,float fee){
this.rollno=rollno;
this.name=name;
this.fee=fee;
}
void display(){
System.out.println(rollno+" "+name+" "+fee);
}
}
class TestThis2{
public static void main(String args[]){
Student s1=new Student(111,"张三",5000f);
Student s2=new Student(112,"李四",6000f);
s1.display();
s2.display();
}
}
输出结果为:
111 张三 5000.0
112 李四 6000.0
开发建议:对变量使用有意义的名称是一种更好的方法。因此,我们对实例变量和参数实时使用相同的名称,建议使用this关键字来区分它们。
3 this调用当前类的方法
你可以使用this关键字调用当前类的方法。如果不使用this关键字,则编译器会在调用该方法时自动添加this关键字。让我们来看一个例子:
/**
* 一点教程网 - http://www.yiidian.com
*/
class A{
void m(){
System.out.println("hello m");
}
void n(){
System.out.println("hello n");
m();//这行代码的作用和this.m()是一样的
this.m();
}
}
class TestThis4{
public static void main(String args[]){
A a=new A();
a.n();
}}
输出结果为:
hello n
hello m
hello m
4 this()调用当前类的构造方法
this() 构造方法调用可用于调用当前类的构造方法。它用于重用构造方法。换句话说,它用于构造方法的链接。
从带参数的构造方法中调用默认无参的构造方法:
/**
* 一点教程网 - http://www.yiidian.com
*/
//从带参数的构造方法中调用默认无参的构造方法
class A{
A(){System.out.println("hello a");}
A(int x){
this();
System.out.println(x);
}
}
class TestThis5{
public static void main(String args[]){
A a=new A(10);
}
}
输出结果为:
hello a
10
从默认无参的构造方法调用带参数的构造方法:
/**
* 一点教程网 - http://www.yiidian.com
*/
//从默认无参的构造方法调用带参数的构造方法
class A{
A(){
this(5);
System.out.println("hello a");
}
A(int x){
System.out.println(x);
}
}
class TestThis6{
public static void main(String args[]){
A a=new A();
}
}
输出结果为:
5
hello a
4.1 this() 构造方法调用的实际用法
this() 构造方法调用实际上可以用于重用构造方法。我们来看下面给出的示例,该示例显示this关键字的实际用法。
/**
* 一点教程网 - http://www.yiidian.com
*/
//使用this关键字重用构造方法
class Student{
int rollno;
String name,course;
float fee;
Student(int rollno,String name,String course){
this.rollno=rollno;
this.name=name;
this.course=course;
}
Student(int rollno,String name,String course,float fee){
this(rollno,name,course);//重用构造方法
this.fee=fee;
}
void display(){
System.out.println(rollno+" "+name+" "+course+" "+fee);
}
}
class TestThis7{
public static void main(String args[]){
Student s1=new Student(111,"张三","java");
Student s2=new Student(112,"李四","java",6000f);
s1.display();
s2.display();
}
}
输出结果为:
111 张三 java 0.0
112 李四 java 6000.0
注意:调用this() 必须是构造方法中的第一条语句。
下面是一个错误示范,开发中要注意:
/**
* 一点教程网 - http://www.yiidian.com
*/
//调用this() 必须是构造方法中的第一条语句。
class Student{
int rollno;
String name,course;
float fee;
Student(int rollno,String name,String course){
this.rollno=rollno;
this.name=name;
this.course=course;
}
Student(int rollno,String name,String course,float fee){
this.fee=fee;
this(rollno,name,course);//这行代码会编译报错
}
void display(){
System.out.println(rollno+" "+name+" "+course+" "+fee);
}
}
class TestThis8{
public static void main(String args[]){
Student s1=new Student(111,"张三","java");
Student s2=new Student(112,"李四","java",6000f);
s1.display();
s2.display();
}
}
5 this作为普通方法调用的参数
this关键字也可以在方法中作为参数传递。它主要用于事件处理。让我们来看一个例子:
/**
* 一点教程网 - http://www.yiidian.com
*/
class S2{
void m(S2 obj){
System.out.println("方法被执行...");
}
void p(){
m(this);
}
public static void main(String args[]){
S2 s1 = new S2();
s1.p();
}
}
输出结果为:
方法被执行...
6 this作为构造方法调用的参数
我们也可以在构造方法中传递this关键字。如果我们必须在多个类中使用一个对象,这种语法就很有用。让我们来看一个例子:
/**
* 一点教程网 - http://www.yiidian.com
*/
class B{
A4 obj;
B(A4 obj){
this.obj=obj;
}
void display(){
System.out.println(obj.data);//调用A4类的data属性
}
}
class A4{
int data=10;
A4(){
B b=new B(this);
b.display();
}
public static void main(String args[]){
A4 a=new A4();
}
}
输出结果为:
10
7 this从方法返回当前类的实例
我们可以将this关键字从方法返回当前类的实例。在这种情况下,方法的返回类型必须是类的类型(非原始类型)。让我们来看一个例子:
7.1 this从方法返回当前类的实例的语法
return_type method_name(){
return this;
}
7.2 this从方法返回当前类的实例的示例
/**
* 一点教程网 - http://www.yiidian.com
*/
class A{
A getA(){
return this;
}
void msg(){
System.out.println("Hello java");
}
}
class Test1{
public static void main(String args[]){
new A().getA().msg();
}
}
输出结果为:
Hello java
7.3 验证this关键词
让我们证明this关键字引用了当前的类实例变量。下面示例中,我们打印两个变量,并且这两个变量的输出是相同的。
/**
* 一点教程网 - http://www.yiidian.com
*/
class A5{
void m(){
System.out.println(this);//this和obj的内存ID是一样的,证明是同一个对象
}
public static void main(String args[]){
A5 obj=new A5();
System.out.println(obj);//打印obj对象的内存ID
obj.m();
}
}
输出结果为:
A5@14ae5a5
A5@14ae5a5
热门文章
优秀文章