Java学习笔记——this的用法
2012-06-20 22:01
633 查看
this在Java中相当于汉语中的“我”,是指调用该方法的对象,比如对于一个人的名字来说,张三说,我的名字是张三,李四说,我的名字是李四,同样是“我”却分别代表了张三和李四。用代码实现就是下面的形式:
Person.java:
测试文件是Test.java:
测试结果是:
my name is 张三
my name is 李四
为什么p1和p2,能够显示不同的名字,是因为,在Person类中的talk()方法中使用的name变量,前面省略的this,那么完整的写法应该是如下:
java中规定,在这种情况下,this关键字是可以省略的。
但是如果换了一种情况,则需要写出this关键字。比如我们把talk()方法修改一下,加上一个参数,如下
这个时候,在类的属性当中含有name变量,但是在talk()方法中也同样含有name变量,这种情况中的talk()方法调用的name变量就是指的是talk中声明的变量,而不是这个类中所声明的那个name变量了,比如我们不妨把测试的Test.java代码也修改一下,如下所示:
测试的结果是:
my name is zhangsan
my name is lisi
也就是说,p1和p2调用的talk()方法里面的name变量,是指的是该方法声明中的那个变量,而不是p1和p2的属性name。
那么如果想对属性中的name进行操作怎么办呢,那么就必须要加上this关键字了,如将Person.java修改为:
则测试的结果为:
我的中文名字是 张三,我的英文名字是 zhangsan
我的中文名字是 李四,我的英文名字是 lisi
也就是说明this.name调用的是属性中的name,而name是talk()中声明的那个变量name。
this关键字能够调用成员变量,同样能够调用成员函数。PS:函数和方法只是两种不同的叫法,一般C/C++中叫函数,Java中叫方法,其实都是指一样的东西
比如我将Person.java进行一下修改,再添加几个成员变量或者说叫做属性:
可以看到,我在构造函数中也声明了三个和成员变量一样的变量,那么如何区分成员变量和函数变量,那么就是通过this关键字进行区分,比如this.name = name,就是将函数中的变量name赋值到成员变量中。
又比如,有些时候,我不需要对这三个成员变量,注意是成员变量进行赋值,我只想赋值其中的两个,那么我就需要再对Person类的构造函数进行重写,如下:
但是,作为程序员我们尽可能让代码能够复用,以减少我们的代码量,我们注意到,在含有三个变量的那个构造函数中,对name和age变量赋值和含有两个变量的构造函数的作用是相同的,也就是说,Person(String name, int age, String address)这个函数中包括了Person(String name, int age)这个函数的代码,注意是包括而不是复用,所以,我们将上面的代码进行一下修改,代码如下:
也就是将
Person(String name, int age, String address)中的前两行代码用this(name, age);进行替换,这样的话,就代表这里调用了Person(String name, int age)这个构造函数,所以这是this的另外一种用法。
我们测试一下,在Test类中我们选择使用三个参数的构造函数:
看一下运行的结果:
两个参数的构造函数
三个参数的构造函数
说明这个三个参数的构造函数执行时显示调用了两个参数的构造函数。
注意:如果使用this的这种用法,必须要注意,this(name, age)必须是第一条语句,也就是说,this(name, age)必须位于含有三个参数的构造函数的函数体中的第一条语句,否则的话,就会报错。
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)必须位于含有三个参数的构造函数的函数体中的第一条语句,否则的话,就会报错。
相关文章推荐
- Java学习笔记三:This用法
- 黑马程序员 java学习笔记之一(java中this和super关键字的用法)
- JAVA学习笔记--this的用法
- java学习笔记-this用法应用举例
- 【Java学习笔记之十四】Java中this用法小节
- 【知了堂学习笔记】java中this和super的用法
- 【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析
- Java之学习笔记(12)-----------数据类型转换valueOf、subString、indexOf用法
- JAVA学习笔记10——static+this
- 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结
- 【Java笔记】Java 中 this 用法小结
- java关于流的学习笔记大全,包含全部流的概念及用法
- Java 网络编程 学习笔记二 Socket 用法
- Java网络学习笔记4:ServerSocket用法
- Java入门学习-理解super,this,@override的用法
- java中关于this的学习笔记
- 【Java学习笔记之二十三】instanceof运算符的用法小结
- [Java] 学习笔记一(String,for循环,多线程,正则表达式,map用法)
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
- 【Java学习笔记之二十一】抽象类在Java继承中的用法小结