关键字:this
this是什么
在Java中,this关键字不算难理解,它的作用和其词义很接近。
它在方法(准确的说是实例方法或非static的方法)内部使用,表示调用该方法的对象
它在构造器内部使用,表示该构造器正在初始化的对象。
this可以调用的结构:成员变量、方法和构造器
什么时候使用this
实例方法或构造器中使用当前对象的成员
在实例方法或构造器中,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的可读性。不过,通常我们都习惯省略this。
但是,当形参与成员变量同名时,如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量。即:我们可以用this来区分成员变量和局部变量。比如:
另外,使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。这
个在继承中会讲到。
举例1:
class Person{ // 定义Person类 private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public void getInfo(){ System.out.println("姓名:" + name) ; this.speak(); } public void speak(){ System.out.println(“年龄:” + this.age); } }
举例2
public class Rectangle { int length; int width; public int area() { return this.length * this.width; } public int perimeter(){ return 2 * (this.length + this.width); } public void print(char sign) { for (int i = 1; i <= this.width; i++) { for (int j = 1; j <= this.length; j++) { System.out.print(sign); } System.out.println(); } } public String getInfo(){ return "长:" + this.length + ",宽:" + this.width +",面积:" + this.area() +",周长:" + this.perimeter(); } }
测试类
public class TestRectangle { public static void main(String[] args) { Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(); System.out.println("r1对象:" + r1.getInfo()); System.out.println("r2对象:" + r2.getInfo()); r1.length = 10; r1.width = 2; System.out.println("r1对象:" + r1.getInfo()); System.out.println("r2对象:" + r2.getInfo()); r1.print('#'); System.out.println("---------------------"); r1.print('&'); System.out.println("---------------------"); r2.print('#'); System.out.println("---------------------"); r2.print('%'); } }
同一个类中构造器互相调用
this可以作为一个类中构造器相互调用的特殊格式。
this():调用本类的无参构造器 this(实参列表):调用本类的有参构造器 public class Student { private String name; private int age; // 无参构造 public Student() { // this("",18);//调用本类有参构造器 } // 有参构造 public Student(String name) { this();//调用本类无参构造器 this.name = name; } // 有参构造 public Student(String name,int age){ this(name);//调用本类中有一个String参数的构造器 this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getInfo(){ return "姓名:" + name +",年龄:" + age; } }
注意:
- 不能出现递归调用。比如,调用自身构造器。 推论:如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)"
- this()和this(实参列表)只能声明在构造器首行 推论:在类的一个构造器中,最多只能声明一个"this(参数列表)
添加必要的构造器,综合应用构造器的重载,this关键字。
Boy
public class Boy { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } private int age; public Boy() { } public Boy(String name, int age) { this.name = name; this.age = age; } public void marry(Girl girl) { System.out.println("我想娶 " + girl.getName()); } public void shout() { if (age > 22) { System.out.println("可以结婚了"); } else { System.out.println("先恋爱吧"); } } }
Girl
public class Girl { private String name; private int age; public Girl() { } public Girl(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void marry(Boy boy) { System.out.println("我要嫁给你 " + boy.getName()); boy.marry(this); // 这里的 this 指的是当前对象 girl } /** * 比较两个对象 * * @param girl * @return */ public int compare(Girl girl) { if (this.age > girl.age) { return 1; } else if (this.age < girl.age) { return -1; } else { return 0; } } }
测试、
public static void main(String[] args) { Boy boy = new Boy("令狐冲", 29); Girl girl = new Girl("任盈盈", 24); girl.marry(boy); boy.shout(); Girl girl1 = new Girl("依琳", 18); System.out.println(girl.compare(girl1)); }