JAVA this关键字

JAVA的 this 关键字

1.前言

  • 在java中,有成员变量和局部变量(方法内的变量),当成员变量和局部变量同名时,该如何区分?这时候,this关键字就能发挥作用。
  • 题外推荐:
    成员变量和局部变量的认识: 文章
    构造方法的认识:文章

2.正文

  • this关键字的应用场景有四处:
    this.成员变量名(属性)//调用其所代表的对象的成员变量;
    this.成员方法名 //调用其所代表的对象的成员方法;
    this(); //在构造方法中调用类中的其他构造方法;
    return this; //返回对象

  • this.成员变量名的使用示例:
	//学生实体类
	public class Student {
		private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0
		public void setAge(int age) {//这里的age为形参
			age = age;//这里使用形参age为age赋值,与成员变量没关系
		}
		public void getAge(){
			System.out.println("年龄为" + age);//这里打印结果是0
		}
	}
	//学生测试类
	public class TestStudent {
	
	    public static void main(String[] args) {
	        //调用Student的构造方法,创建一个Student类对象
	        Student s = new Student();
	        //调用Student类的setAge(int age)方法,设置年龄,我们将其设置为15
	        s.setAge(15);
	        //调用Student类的getAge()方法,获取年龄
	        s.getAge();
	
	    }
	}

我们调用setAge(15)方法,并为其传值15,是想将年龄设置为15,可最后打印结果:

在这里插入图片描述
这里,分析一下:
当15这个值被传递到 public void setAge(int age) 这个方法时,形参age的值就是15,然后在方法中:

public void setAge(int age) {//这里的age为形参,值15
			age = age;//这里将形参age的值15,赋值给名为age的局部变量。
			//因为在java中使用变量的原则是就近原则,所以成员变量age在这里并没有被用到
			//所以最后打印成员变量age,结果是默认值0
}

当加上this关键字后,结果就不一样了。修改Student类的代码:

	public class Student {
	
	        private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0
	        public void setAge(int age) {//局部变量的age
	            this.age = age;//this.age,代表成员变量的age
	            //这里的赋值指将局部变量的age值赋给成员变量
	        }
	        public void getAge(){
	            System.out.println("年龄为" + age);
	        }
	}
	

再运行一遍TestStudent测试类,结果:
在这里插入图片描述
所以,当局部变量和成员变量同名时,如果要操作成员变量,最好使用this关键字。

  • this.成员方法的使用示例:
public class Student {

        private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0
        public void setAge(int age) {
            this.age = age;
            this.getAge();//在setAge成员方法中调用另一个成员方法
        }
        public void getAge(){
            System.out.println("年龄为" + age);
        }
}

public class TestStudent {

    public static void main(String[] args) {

        Student s = new Student();
        s.setAge(15);
   
    }
}

打印结果:
在这里插入图片描述
在一个成员方法中调用另一个成员方法,这个没什么需要特别注意的。

  • this(); 调用构造方法的使用示例:
public class Student {

    private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0

    //无参数构造方法,当没有主动定义时,系统默认提供
    public Student() {
    	//在无参构造方法中调用有参数的构造方法
        this(15);
    }
    //带参数构造方法,自己主动定义,可以用来实例化对象时给对象属性赋值
    public Student(int age) {
        this.age = age;//为成员变量赋值
        System.out.println("年龄为:" + age);//打印成员变量age
    }
}
public class TestStudent {

    public static void main(String[] args) {
		//使用无参构造方法创建Student类对象s
        Student s = new Student();
        
    }
}

打印结果:
在这里插入图片描述
注意:这里使用this(); 调用构造方法有几个注意事项!!!

 *. 使用this();调用构造方法,只能在构造方法中使用!!!
 *. this();必须在第一行!!!
 *. 在一个构造方法中,只能调用一个构造方法!!!
  • 使用this返回对象的使用示例:
public class Student {

        private int age;//定义int类型的成员变量,当创建一个Student类的对象时,会有默认值0
        public Student setAge(int age) {//设置年龄,并返回对象
            this.age = age;//为成员变量赋值
            return this;//返回this指代的对象,是个值,地址值
        }
      
}

public class TestStudent {

    public static void main(String[] args) {

        Student s = new Student();
        System.out.println(s);//Student类对象,引用数据类型,输出的是地址值
        System.out.println(s.setAge(15));//s.setAge()方法会返回一个对象,输出的也是地址值
        Student s1 = s.setAge(15);//将返回的对象赋给一个Student类变量,注意是变量
        System.out.println(s1);
    }
}

运行结果:
在这里插入图片描述
分析:
第一个输出语句输出的是Student类对象的地址;
第二个输出语句输出的是Student类对象s调用了setAge()方法后返回的结果,那结果是一个对象,存放的是地址值;
第三个输出语句详解:利用Student类对象s调用setAge()方法后返回一个结果,这个结果是一个对象,存的是地址值,且将这个结果赋给了新创建的Student类变量s1(注意s1是个引用数据类型的变量),这个变量存放了地址值。
为何第二个、第三个输出结果与第一个相同?
看代码:
public Student setAge(int age) {//设置年龄,并返回对象
this.age = age;//为成员变量赋值
return this;//返回this指代的对象,是个值,地址值
}
代码中的return this; 代表的是返回this所指代的对象!!
那么this指代的对象是谁?
我的理解:
哪个对象调用了方法,那么此时this指代的便是哪个对象!
因为s.setAge(15)
调用setAge方法的是Student的对象s,所以此时this指代的便是s这个对象!所以第二个输出结果是对象s的地址。
同理。
第三个输出语句 Student s1 = s.setAge(15);
等号右边 s.setAge(15)代表Student对象s调用方法,并返回s
等号左边 创建一个Student类变量s1,用来接收右边的返回结果! 所以此时s1的值是对象s的值,也就是对象s的地址值!所以输出结果相同!

3.思维导图总结

在这里插入图片描述

4.参考文章

https://blog.csdn.net/benxiangsj/article/details/124282800

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值