一.使用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,一起进步。