5.This关键字

This关键字:

在讲述之前,强调一下重点:

类中的变量一定要看清是实例变量还是静态变量:

实例变量只能通过“引用.”的方式去调用。

静态变量一般通过“类名.”的方式去调用

实例方法和静态方法调用同上。

1.this是个关键字

public class ThisTest01{
	//this关键字
	String name;
	public void f(){
		System.out.println(name);
        //System.out.println(引用.name);
	}
}

观察上述代码,name是个实例变量,只能通过引用.的方式访问,可是为什么方法f()中直接访问了呢?实际上这里省略了this关键字,这说明this是一个变量,是一个引用,this保存的是当前对象的地址,指向自身

2.this是什么?在内存上怎么体现?

在这里插入图片描述

this关键字存储在堆中对象的内部,this是一个变量,其中保存了当前对象的内存地址。换句话说,this就是当前对象

一般的,this写在实例方法内部,哪个对象调用该实例方法,this就代表该对象:

public class ThisTest02{
	//this关键字
	String name;
	public ThisTest02(String s){
		name = s;
	}
	public void f(){
		System.out.println(this.name);//这里的引用肯定不能写c1或c2,因为它们是局部变量
	}
	public static void main(String[] args){
		ThisTest02 c1 = new ThisTest02("张三");
		c1.f();//调用f()时,this就代表c1
		ThisTest02 c2 = new ThisTest02("李四");
		c2.f();//调用f()时,this就代表c2
	
	}
}

3.this能使用在静态方法中吗?

**不可以。**this指代的是当前对象,而静态方法的执行不需要对象。矛盾了

为什么set/get方法是实例方法?

因为二者都在方法内部访问了实例变量,是对象级别的方法。,定义为static系统会报错

public class ThisTest03{
	String name;
	
	//set/get方法实际上都省略的this关键字
	//注意这里的this指的是调用setName/getName实例方法的
	//对象,而不是类中那个实例变量!!!
	public String getName(){
		return this.name;
	}
	public void setName(String s){
		this.name = s;
	}
	//this指代对象tt
	public static void main(String[] args){
		ThisTest03 tt = new ThisTest03();
		System.out.println(tt.getName());
		tt.setName("zhangsan");
		System.out.println(tt.getName());
	}
}
//null
//zhangsan

4.this什么时候不能省略?

在实例方法中,一般为了增加代码的可读性,方法的形式参数名也应该定义为属性名,此时,由于变量的就近原则。若不加this区分实例变量和局部变量,会出现错误。

/*
1、this可以使用在实例方法中,不能使用在静态方法中。
2、this关键字大部分情况下可以省略,什么时候不能省略呢?
	在实例方法中,或者构造方法中,为了区分局部变量和实例变量,
	这种情况下:this. 是不能省略的。
*/
public class ThisTest03{
	public static void main(String[] args){

		Student s = new Student();
		s.setNo(111);
		s.setName("张三");
		System.out.println("学号:" + s.getNo());
		System.out.println("姓名:" + s.getName());

		Student s2 = new Student(2222, "李四");
		System.out.println("学号:" + s2.getNo());
		System.out.println("姓名:" + s2.getName());

	}
}

// 分析一下:以下代码哪里写的不好。
// 学生类
class Student{
	//学号
	private int no;

	//姓名
	private String name;

	//构造方法无参
	public Student(){
	
	}

	//构造方法有参
	/*
	public Student(int i, String s){
		no = i;
		name = s;
	}
	*/

	// 上面的构造方法也增强一下可读性
	public Student(int no, String name){
		this.no = no;
		this.name = name;
	}

	// setter and getter方法
	/*
	public void setNo(int i){
		no = i;
	}
	*/
	/*
	public void setNo(int no){ // 就近原则。
		no = no; //这两个no都是局部变量no,和实例变量no没关系。
	}
	*/
	public void setNo(int no){ 
		//no是局部变量
		//this.no 是指的实例变量。
		this.no = no; // this. 的作用是:区分局部变量和实例变量。
	}
	public int getNo(){
		return no;
		//return this.no;
	}
	/*
	public void setName(String s){
		name = s;
	}
	*/
	/*
	public void setName(String name){ // 就近原则
		name = name; //这两个name都是局部变量name,和实例变量name没关系。
	}
	*/
	public void setName(String name){
		this.name = name;
	}

	/*
	public String getName(){
		return name;
	}
	*/

	public String getName(){ // getName实际上获取的是“当前对象”的名字。
		//return this.name; // 严格来说,这里是有一个 this. 的。只不过这个 this. 是可以省略的。
		return name;
	}
}

5.this()的使用方法:

注意:

this()只能使用在构造方法的第一行,表示调用本类的其他构造方法,作用是实现代码复用

public class ThisTest04{
	public static void main(String[] args){
		Date d1 = new Date();
		d1.detail();
		Date d2 = new Date(2021,4,8);
		d2.detail();
	}
	
}
class Date{
	//年
	private int year;
	//月
	private int month;
	//日
	private int day;
	
	//无参构造方法
	public Date(){
		//两个构造方法的代码重复
		/*
		this.year = 1970;
		this.month = 1;
		this.day = 1;
		*/
		this(1971,1,1);//使用this(实际参数列表)调用本类的其他构造方法
	}
	//有参构造方法
	public Date(int year,int month,int day){
		this.year = year;
		this.month = month;
		this.day = day;
	}
	//getter/setter
	public void setYear(int year){
		this.year = year;
	}
	public int getYear(){
		return year;
	}
	public void setMonth(int month){
		this.month = month;
	}
	public int getMonth(){
		return month;
	}
	public void setDay(int day){
		this.day = day;
	}
	public int getDay(){
		return day;
	}
	public void detail(){
		System.out.println(year+"年"+month+"月"+day+"日");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值