您的位置:首页 > 编程语言 > Java开发

Java学习笔记——this的用法

2012-06-20 22:01 633 查看
this在Java中相当于汉语中的“我”,是指调用该方法的对象,比如对于一个人的名字来说,张三说,我的名字是张三,李四说,我的名字是李四,同样是“我”却分别代表了张三和李四。用代码实现就是下面的形式:

Person.java:

public class Person{
String name;

void talk(){
System.out.println("my name is " + name);
}
}


测试文件是Test.java:

public class Test{
public static void main(String[] args){
Person p1 = new Person();
p1.name = "张三";

Person p2 = new Person();
p2.name = "李四";

p1.talk();
p2.talk();
}
}


测试结果是:

my name is 张三

my name is 李四

为什么p1和p2,能够显示不同的名字,是因为,在Person类中的talk()方法中使用的name变量,前面省略的this,那么完整的写法应该是如下:

public class Person{
String name;

void talk(){
System.out.println("my name is " + this.name);
}
}


java中规定,在这种情况下,this关键字是可以省略的。

但是如果换了一种情况,则需要写出this关键字。比如我们把talk()方法修改一下,加上一个参数,如下

public class Person{
String name;

void talk(String name){
System.out.println("my name is " + name);
}
}


这个时候,在类的属性当中含有name变量,但是在talk()方法中也同样含有name变量,这种情况中的talk()方法调用的name变量就是指的是talk中声明的变量,而不是这个类中所声明的那个name变量了,比如我们不妨把测试的Test.java代码也修改一下,如下所示:

public class Test{
public static void main(String[] args){
Person p1 = new Person();
p1.name = "张三";

Person p2 = new Person();
p2.name = "李四";

p1.talk("zhangsan");
p2.talk("lisi");
}
}


测试的结果是:

my name is zhangsan

my name is lisi

也就是说,p1和p2调用的talk()方法里面的name变量,是指的是该方法声明中的那个变量,而不是p1和p2的属性name。

那么如果想对属性中的name进行操作怎么办呢,那么就必须要加上this关键字了,如将Person.java修改为:

public class Person{
String name;

void talk(String name){
System.out.println("我的中文名字是 " + this.name + ",我的英文名字是 " + name);
}
}


则测试的结果为:

我的中文名字是 张三,我的英文名字是 zhangsan

我的中文名字是 李四,我的英文名字是 lisi

也就是说明this.name调用的是属性中的name,而name是talk()中声明的那个变量name。

this关键字能够调用成员变量,同样能够调用成员函数。PS:函数和方法只是两种不同的叫法,一般C/C++中叫函数,Java中叫方法,其实都是指一样的东西

比如我将Person.java进行一下修改,再添加几个成员变量或者说叫做属性:

public class Person{
String name;
int age;
String address;

//构造函数
Person(){
System.out.println("无参数的构造函数");
}

Person(String name, int age, String address){
this.name = name;
this.age = age;
this.address = address;
}

void talk(String name){
System.out.println("我的中文名字是 " + this.name + ",我的英文名字是 " + name);
}
}


可以看到,我在构造函数中也声明了三个和成员变量一样的变量,那么如何区分成员变量和函数变量,那么就是通过this关键字进行区分,比如this.name = name,就是将函数中的变量name赋值到成员变量中。

又比如,有些时候,我不需要对这三个成员变量,注意是成员变量进行赋值,我只想赋值其中的两个,那么我就需要再对Person类的构造函数进行重写,如下:

public class Person{
String name;
int age;
String address;

//构造函数
Person(){
System.out.println("无参数的构造函数");
}

Person(String name, int age){
this.name = name;
this.age = age;
}

Person(String name, int age, String address){
this.name = name;
this.age = age;
this.address = address;
}

void talk(String name){
System.out.println("我的中文名字是 " + this.name + ",我的英文名字是 " + name);
}
}


但是,作为程序员我们尽可能让代码能够复用,以减少我们的代码量,我们注意到,在含有三个变量的那个构造函数中,对name和age变量赋值和含有两个变量的构造函数的作用是相同的,也就是说,Person(String name, int age, String address)这个函数中包括了Person(String name, int age)这个函数的代码,注意是包括而不是复用,所以,我们将上面的代码进行一下修改,代码如下:

public class Person{
String name;
int age;
String address;

//构造函数
Person(){
System.out.println("无参数的构造函数");
}

Person(String name, int age){
this.name = name;
this.age = age;
System.out.println("两个参数的构造函数");
}

Person(String name, int age, String address){
this(name, age);
this.address = address;
System.out.println("三个参数的构造函数");
}

void talk(String name){
System.out.println("我的中文名字是 " + this.name + ",我的英文名字是 " + name);
}
}


也就是将
Person(String name, int age, String address)中的前两行代码用this(name, age);进行替换,这样的话,就代表这里调用了Person(String name, int age)这个构造函数,所以这是this的另外一种用法。

我们测试一下,在Test类中我们选择使用三个参数的构造函数:

public class Test{
public static void main(String[] args){
Person p1 = new Person("zhangsan", 21, "beijing");

}
}


看一下运行的结果:

两个参数的构造函数

三个参数的构造函数

说明这个三个参数的构造函数执行时显示调用了两个参数的构造函数。

注意:如果使用this的这种用法,必须要注意,this(name, age)必须是第一条语句,也就是说,this(name, age)必须位于含有三个参数的构造函数的函数体中的第一条语句,否则的话,就会报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: