一、目录
- this介绍
- this本质
- this细节
- this练习
java虚拟机会给每个对象分配this,代表当前对象。 解决类成员函数的形参和成员变量同名的问题。
例如:
public class javathis {
public static void main(String[] args){
Cat cat1 = new Cat("mi", 2);
System.out.println(cat1.name);
System.out.println(cat1.age);
}
}
class Cat{
String name;
int age;
public Cat(String name, int age){
name = name;
age = age;
}
}
//null
//0
因为构造方法的形参与类成员变量同名,所以赋值的时候,直接将类成员变量赋值给类成员变量,所以还是初始值。
想要形参和类成员变量同名,但是又不影响赋值,就需要用到this关键字。
将上面的赋值语句改为:
public Cat(String name, int age){
this.name = name;
this.age = age;
}
//mi
//2
三、this本质
this的本质就是指向当前对象本身,this的地址和对象的地址是一样的。 用hashCode来证明一下,hashCode的值不是地址,但是在这里,可以当做地址。 由object类定义的hashCode方法会针对不同的对象返回不同的整数。(这是通过将该对象的内部地址转换成一个整数来实现的)
public class javathis {
public static void main(String[] args){
Cat cat1 = new Cat("mi", 2);
System.out.println("cat1 addr:" + cat1.hashCode());
}
}
class Cat{
String name;
int age;
public Cat(String name, int age){
this.name = name;
this.age = age;
System.out.println("this addr:" + this.hashCode());
}
}
//this addr:460141958
//cat1 addr:460141958
简单的说,哪个对象调用,this就代表哪个对象
public class javathis {
public static void main(String[] args){
Cat cat1 = new Cat("mi", 2);
System.out.println("cat1 addr:" + cat1.hashCode());
cat1.Info();
Cat cat2 = new Cat("ci", 3);
System.out.println("cat2 addr:" + cat2.hashCode());
cat1.Info();
}
}
class Cat{
String name;
int age;
public Cat(String name, int age){
this.name = name;
this.age = age;
System.out.println("this addr:" + this.hashCode());
}
public void Info(){
System.out.println("add:" + this.hashCode());
}
}
//this addr:460141958
//cat1 addr:460141958
//add:460141958
//this addr:1163157884
//cat2 addr:1163157884
//add:460141958
四、this细节
- this关键字可以用来访问本类的属性、方法、构造器。
- this用于区分当前类的属性和局部变量。
- 访问成员方法的语法:this.方法名(参数列表)。
- 访问构造器语法:this(参数列表)。只能在构造器中使用,并且必须放在第一行。
- this不能在类定义的外部使用,只能在类定义的方法中使用。
对于第四点,实例:
public class javathis {
public static void main(String[] args){
Cat cat = new Cat();
}
}
class Cat{
String name;
int age;
Cat(){
this("kimi",2);
System.out.println("Cat()");
}
public Cat(String name, int age){
this.name = name;
this.age = age;
System.out.println("Cat(String name, int age)");
}
}
//Cat(String name, int age)
//Cat()
细节:
this(参数列表)必须放在第一行,不然会报错。 并且再强调一次,this(参数列表)只能在构造器中使用。不能在其他成员方法中使用。
五、this练习定义Person2类,里面有name、age属性,并提供compareTo比较方法,用于判断是否和另一个人相等,名字和年龄完全一样,就返回true,否则返回false。
public class javathis {
public static void main(String[] args){
Person2 p1 = new Person2("li", 22);
Person2 p2 = new Person2("wu", 22);
p1.compareTo(p2);
System.out.println( p1.compareTo(p2));
}
}
class Person2{
String name;
int age;
public boolean compareTo(Person2 p){
if(this.name.equals(p.name) && this.age == p.age){
return true;
}else {
return false;
}
}
public Person2(String name, int age){
this.name = name;
this.age = age;
}
}
//false