this
假如说构造器传入的形参和类的成员属性名字一样,则构造器就失去作用,所以引入this,什么是this? java虚拟机给每个对象分配this,代表当前对象
注意:哪个对象调用,this就代表哪个对象
改版前
public class text{
public static void main(String[] args) {
Person p2 = new Person("jack",20);//调用有参构造器,并初始化对象p2
System.out.println("p2对象的名字"+p2.name+"p2对象的年龄"+p2.age);//因为作用域的就近原则,则p2.name=null默认值,age=100
}
}
class Person {
int age=100;
String name;
public Person(String name, int age){//因为构造器与类都定义了相同变量的名字,所以调用采取就近原则
name=name; //jack=jack
age=age;//20=20
}
}
改版后
public class text{
public static void main(String[] args) {
Person p = new Person("jack",20);//调用有参构造器,并初始化对象p
System.out.println("p对象的名字"+p.name+"p对象的年龄"+p.age);//p.name=jack,age=20
}
}
class Person {
int age=100;
String name;
public Person(String name, int age){//因为构造器与类都定义了相同变量的名字,所以调用采取就近原则
this.name = name; //当前对象p的属性name=jack
this.age = age;//当前对象p的属性age=20
}
}
注意事项
this是一个对象,this可以访问本类的属性和方法,构造器
this用于区分当前类的属性和局部变量
访问成员方法的语法:` this.方法名(参数列表)
public class text{ public static void main(String[] args) { } } class T{ public void f1() { System.out.println("Hello,world"); } public void f2() { //此时调用f1方法有两种 f1(); this.f1(); } }
- 访问构造器语法:
this(参数列表)
,注意只能在构造器中使用为什么这样写呢,为了区别对象this调用方法this.方法()
而且构造器调用构造器时,才能使用 this(参数)
注意使用this从A构造器调用B构造器,this(参数)语句必须在A构造器的第一句话 public class text{ public static void main(String[] args) { T t =new T(); } } class T{ public T() { this("jack",18); System.out.println("Hello,world"); //在无参构造器T()中调用 T(String name,int age)的构造器 } public T(String name,int age) { System.out.println("public T(String name,int age)的构造器"); } }
- this不能在类定义的外部使用,只能在类定义的方法中使用
public class text{ public static void main(String[] args) { T t =new T(); t.f1(); } } class T{ String name ="jack"; int age = 20; public void f1() { String name="Tom"; System.out.println(name+age); //Tom 20 System.out.println(this.name+this.age); // jack 20 } }
练习
//p判断同类的两个对象人是否相等
public class text{
public static void main(String[] args) {
Person p1 =new Person("jack",10);
Person p2 =new Person("Tom",15);
System.out.println("两人是否相同"+p1.compareTo(p2));
}
}
class Person {
String name;
int age;
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public boolean compareTo(Person p) {
// if(p.name .equals(this.name) && p.age == this.age ) {
// return ture;
// }
// else
// return false;
return p.name .equals(this.name) && p.age == this.age ;
}
}