this
文章目录
概念 :this 关键字是 Java常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,可以将this理解为一个指针,即谁调用该类的方法或属性,this就指向谁。
引出This
为什么我们需要this关键字?用以下案例对this进行引出
java
public class Test01{
public static void main(String[] args){
Person p = new Person("胡歌",41);
p.show();
}
}
class Person{
String names;
int ages;
public Person(String name,int age){
names = name;
ages = age
}
public void show(){
System.out.println(names+"---"+ages);
}
}
输出结果:
以上写法不会出现问题,但是当我们将成员属性的变量名改为和有参构造方法Person(String name,int age)相同时就会出现问题
例如:
java
public class Test01{
public static void main(String[] args){
Person p = new Person("胡歌",41);
p.show();
}
}
class Person{
String name;
int age;
public Person(String name,int age){
name = name;
age = age;
}
public void show(){
System.out.println(name+"---"+age);
}
}
运行结果:
为什么会出现以上情况?
原因:
- 构造器的name是局部变量,不是属性,构造器的age也是局部变量,不是属性
- name = name时两个name都是就近原则匹配的是构造器里面的局部变量name,实际上构造器里面变成了"胡歌=胡歌;41=41"并没有对上面的属性造成影响,成员属性的name依然为默认值null,age为默认值0。
解决办法:
java
public Person(String name,int age){
this.name = name;
this.age = age;
}
这样,this.name就是指的p对象的成员属性,而name就是来自于构造方法中的局部变量,age同理。
this的作用
- this.属性:调用本对象的成员属性
- this.方法:调用本对象的成员方法
- this():在构造方法的第一句调用另外一个构造方法
this.属性
代码案例:
class Person {
//属性
String name;
char sex;
int age;
//构造方法 -- 有参构造
public Person(String name,char sex,int age){
this.name = name;
this.sex = sex;
this.age = age;
}
}
public class Test01 {
public static void main(String[] args) {
Person p = new Person("胡歌",'男',41);
}
}
在上述代码中 name、sex和 age为Person类的三个成员属性,通过this.name=name;this.sex=sex;this.age=age;将带参构造器中的值赋值给成员属性。
内存分析
this.方法名
this 关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。
代码实现:
java
class Person {
//属性
String name;
char sex;
int age;
//构造方法 -- 有参构造
public Person(String name,char sex,int age){
this.name = name;
this.sex = sex;
this.age = age;
}
//成员方法
public void eat(){
//this.属性:调用本对象的成员属性
System.out.println(this.name + "吃饭");
}
public void sleep(){
//this.属性:调用本对象的成员属性
System.out.println(this.name + "睡觉");
}
public void writerCode(){
//this.属性:调用本对象的成员属性
System.out.println(this.name + "写代码");
}
public void study(){
//this.方法:调用本对象的成员方法
this.eat();
this.writerCode();
this.sleep();
}
}
public class Test01 {
public static void main(String[] args) {
Person p = new Person("胡歌",'男',41);
p.study();
}
}
运行结果:
胡歌吃饭
胡歌写代码
胡歌睡觉
分析:
创建对象过后,p对象的成员属性name="胡歌";sex='男';age=41;当执行p.study()后,this就指向了p,接着study()方法中调用this.eat();this.writerCode();和this.sleep()方法,其实就算是study()方法中调用的其他方法没有加this,编译器都会默认加上一个this。
this()构造方法
this( ) 用来访问本类的构造方法(构造方法是类的一种特殊方法,方法名称和类名相同,没有返回值。)
代码实现:
java
class Person {
//属性
String name;
char sex;
int age;
//构造方法 -- 无参构造
public Person(){
//this():在构造方法的第一句调用另外一个构造方法
this("彭于晏", '男', 46);
System.out.println("Person的无参构造");
}
//构造方法 -- 有参构造
public Person(String name,char sex,int age){
this.name = name;
this.sex = sex;
this.age = age;
}
}
public class Test01 {
public static void main(String[] args) {
Person p = new Person();
}
}
注意:
- this关键字可以用来访问本类的属性、方法、构造器。
- this用于区分当前类的属性和局部变量。
- 访问成员方法的语法:this.方法名(参数列表)。
- 访问构造器语法:this(参数列表);在构造方法中使用时必须放在第一行。
- this不能在类定义的外部使用,只能在类定义的方法中使用。