Java:this
package com.demo.day;
public class This01 {
public static void main(String[] args) {
Dog1 dog1 = new Dog1("耗子",3);
dog1.info();
}
}
class Dog1{
String name;
int age;
// public Dog1(String dName,int dAge){
// name = dName;
// age = dAge;
// }
//出现了一个问题,根据变量的作用域原则
//构造器的name 就是局部变量,而不是属性
//引出 ————> this 关键字
public Dog1(String name,int age){
this.name = name; //当前对象的属性name = 局部变量name
this.age = age; //当前对象的属性age = 局部变量age
}
//如果我们构造器的形参,能够直接写成属性名就更好了
public void info(){
System.out.println(name + "\t" + age + "\t");
}
}
什么是this
java虚拟机会给每个对象分配this,代表当前对象。
使用hashCode()方法来查看this是否是本类的引用;
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
package com.demo.day;
public class This01 {
public static void main(String[] args) {
Dog1 dog1 = new Dog1("耗子",3);
Dog1 dog2 = new Dog1("三花",2);
//调用hashCode()方法
System.out.println("dog1的hashcode:" + dog1.hashCode());
System.out.println("dog2的hashcode:" + dog2.hashCode());
// dog1.info();
}
}
class Dog1{
String name;
int age;
// public Dog1(String dName,int dAge){
// name = dName;
// age = dAge;
// }
//出现了一个问题,根据变量的作用域原则
//构造器的name 就是局部变量,而不是属性
//引出 ————> this 关键字
public Dog1(String name,int age){
this.name = name; //当前对象的属性name = 局部变量name
this.age = age; //当前对象的属性age = 局部变量age
//调用hashCode()方法
System.out.println("this.hashcode = " + this.hashCode());
}
//如果我们构造器的形参,能够直接写成属性名就更好了
public void info(){
System.out.println(name + "\t" + age + "\t");
}
}
输出结果:
this.hashcode = 1324119927
this.hashcode = 81628611
dog1的hashcode:1324119927
dog2的hashcode:81628611
this小结
简单的说,哪个对象调用,this就代表哪个对象
this使用细节
- this关键字可以用来访问本类的属性、方法、构造器
- this用于区分当前类的属性和局部变量
- 访问成员方法的语法:this.方法名(参数列表);
- 访问构造器语法:this(参数列表); 注意只能在构造器中使用
- this不能在类定义的外部使用,只能在类定义的方法中使用
下面代码将上述细节呈现
package com.demo.day;
public class thisDetail {
public static void main(String[] args) {
// T1 t1 = new T1();
// t1.f2();
T1 t2 = new T1();
t2.f3();
}
}
class T1{
String name = "Tom";
int num;
//细节:访问成员方法的语句:this.方法名(参数列表)
//注意:访问构造器语法:this(参数列表);必须放在构造器的第一条语句
//对构造器的访问 注意只能在构造器中使用,即不能成员方法访问构造器,只能构造器互相访问
public T1(){
//从这里去访问 T1(String name,int age) 构造器
this("jack",21);//对this的调用必须是构造器中的第一个语句
System.out.println("T1() 构造器");
}
public T1(String name,int age){
System.out.println("T1(String name,int age) 构造器");
}
public void f1(){
System.out.println("f1() 方法..");
}
public void f2(){
System.out.println("f2() 方法..");
//调用本类的 f1
//第一种方式
f1();
//第二种方式
this.f1();
}
//this 关键字可以用来访问本类的属性
public void f3(){
String name = "smith";//变量作用域的就近原则会导致下面的输出不同
//传统方式
System.out.println("name=" + name + "\tnum=" + num);
//也可以使用this访问属性
System.out.println("name=" + this.name + "\tnum=" + this.num);
}
}
测试
package com.demo.day;
public class TestPerson {
public static void main(String[] args) {
Person3 p = new Person3("smith",21);
Person3 p2 = new Person3("tom",21);
System.out.println(p.compareTo(p2));
}
}
class Person3{
String name;
int age;
Person3(String name,int age){
this.name = name;
this.age = age;
}
public boolean compareTo(Person3 p){
// if (this.name.equals(p.name) && this.age == p.age){
// return true;
// }
return this.name.equals(p.name) && this.age == p.age;
}
}