Java学习:十一.this和static---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();
    	s2.setNo(222);
    	s2.setName("李四");
    	
    	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) {  //i的命名不规范
		no = i;
		name = s;
	}
	public void setNo(int i) {
		no = i;
	}
	public int getNo() {
		return no;
	}
	public void setName(String s) {
		name = s;
	}
	public String getName() {
		return name;
	}
}

该程序没有错误,结果也正确,如下
在这里插入图片描述
但是我们命名i变量不符合我们“见名知意”的原则,所以有的同学就想把程序改成如下的:

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();
    	s2.setNo(222);
    	s2.setName("李四");
    	
    	System.out.println("学号:" + s2.getNo());
    	System.out.println("姓名" + s2.getName());
    }
}
class Student{
	private int no;
	private String name;
	public Student() {}
	public Student(int no, String name) {  //i的命名不规范
		no = no;
		name = name;
	}
	public void setNo(int no) {
		no = no;
	}
	public int getNo() {
		return no;
	}
	public void setName(String name) {
		name = name;
	}
	public String getName() {
		return name;
	}
}

他把i全部换成了no,但此时运行出来的结果却不同了。

在这里插入图片描述

这是什么原因呢?
我们选取一个片段,实际上是因为就近原则,所以两个no都是参数中的no,而不是Student类的数据域no,Student类的数据域no还是默认值,所以输出结果为默认值0
在这里插入图片描述

于是我们将程序改一下:

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();
    	s2.setNo(222);
    	s2.setName("李四");
    	
    	System.out.println("学号:" + s2.getNo());
    	System.out.println("姓名" + s2.getName());
    }
}
class Student{
	private int no;
	private String name;
	public Student() {}
	public Student(int no, String name) {  //i的命名不规范
		this.no = no;
		this.name = name;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public int getNo() {
		return no;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}

输出正确的结果。

在这里插入图片描述
这里的this的作用是为了区分局部变量和实例变量。

二.使用this调用构造方法

先来看一段程序:

public class ThisTest04 {
    public static void main(String[] args) {
    	Date d1 = new Date();
    	d1.detail();
    	Date d2 = new Date(2008, 8, 8);
    	d2.detail();
    }
}

class Date{
	private int year;
	private int month;
	private int day;
	public Date() {                                         //构造函数1
		this.year = 1970;
		this.month = 1;
		this.day = 1;
	}
	public Date(int year, int month, int day) {            //构造函数2
		this.year = year;
		this.month = month;
		this.day = day;
	}
	public void detail() {
		System.out.println(year+"年"+month+"月"+day+"日");
	}
	public void setYesr(int year) {
		this.year = year;
	}
	public int getYear(int year) {
		return year;
	}
	public void setmonth(int month) {
		this.month = month;
	}
	public int getMonth(int month) {
		return month;
	}
	public void setDay(int day) {
		this.day = day;
	}
	public int getDay(int day) {
		return day;
	}
} 

在这里插入图片描述

我们观察上面两个构造函数,发现它们函数体是相同的,那我们可不可以简化一下呢。答案是肯定的,如下,我们改变第一个构造函数:

public Date() {
		/**
		 * this.year = 1970;
		 *this.month = 1;
		 *this.day = 1;
		 */
		this(1970, 1, 1);
	}

运行发现结果没有问题。
注意,this()这种语法只能出现在构造方法的第一行,前面不能有任何东西,例如下面都是错误的:

/**
 *错误示范1
 */
public Date() {
		/**
		 * this.year = 1970;
		 *this.month = 1;
		 *this.day = 1;
		 */
		System.out.println("this is :")
		this(1970, 1, 1);
	}
/**
 *错误示范2
 */
public Date() {
		/**
		 * this.year = 1970;
		 *this.month = 1;
		 *this.day = 1;
		 */
		this(1970, 1, 1);
		this(1970, 1, 1);
	}

最近笔者也在运营公众号,欢迎大家的关注!我们一起学习Java,一起进步。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值