JAVA this关键字
this关键字
如果我们构造器的形参,能够直接写成属性名,就更好了,方便阅读,但是根据变量的作用域原则
- 构造器name 就是这个方法中的局部变量,而不是属性了
- 构造器age 就是这个方法中的局部变量,而不是属性了
即出了这个方法就会销毁,由此引出this关键字
package This_Practice;
public class ThisDemo01 {
public static void main(String[] args) {
Dog dog1 = new Dog("大壮",3);
dog1.info();//大壮 3
}
}
class Dog{
String name;
int age;
//如果我们构造器的形参,能够直接写成属性名,就更好了
//但是出现了一个问题,根据变量的作用域原则
//1.构造器name 就是这个方法中的局部变量,而不是属性了
//2.构造器age 就是这个方法中的局部变量,而不是属性了
//出了这个方法就会销毁,
//那要怎么才能提高代码的可读性呐
//使用this关键字
public Dog(String name, int age) {//构造器
//this.name 就是当前对象的属性,即成员变量
this.name = name;
//this.age 就是当前对象的属性,即成员变量
this.age = age;
//谁在调用这个构造器,那么它的this指的就是哪一个成员方法
}
public void info() {//成员方法
System.out.println("姓名"+ "\t" + "年龄");
System.out.println(name + "\t" + age);
}
}
深入理解this
每创建一个对象,就会给该对象分配一个this,代表当前对象
package This_Practice;
public class ThisDemo01 {
public static void main(String[] args) {
Dog dog1 = new Dog("大壮",3);
System.out.println("dog1的hashcode=" + dog1.hashCode());
dog1.info();//大壮 3
Dog dog2 = new Dog("大黄",2);
System.out.println("dog2的hashcode=" + dog2.hashCode());
dog2.info();//大黄 2
System.out.println();
}
}
class Dog{
String name;
int age;
//如果我们构造器的形参,能够直接写成属性名,就更好了
//但是出现了一个问题,根据变量的作用域原则
//1.构造器name 就是这个方法中的局部变量,而不是属性了
//2.构造器age 就是这个方法中的局部变量,而不是属性了
//出了这个方法就会销毁,
//那要怎么才能提高代码的可读性呐
//使用this关键字
public Dog(String name, int age) {//构造器
//this.name 就是当前对象的属性,即成员变量
this.name = name;
//this.age 就是当前对象的属性,即成员变量
this.age = age;
//谁在调用这个构造器,那么它的this指的就是哪一个成员方法
}
public void info() {//成员方法
System.out.println("this的hashcode="+this.hashCode());
System.out.println("姓名"+ "\t" + "年龄");
System.out.println(name + "\t" + age);
}
}
内存图:
运行效果图
this小结:
- 简单的说,哪个对象调用,this就代表哪个对象
注意事项和细节
- this 关键字可以用来访问本类的属性、方法、构造器
- this 用于区分当前类的属性和局部变量
- 访问成员方法的语法:
this.方法名(参数列表);
代码如下
package This_Practice;
public class ThisDetail {
public static void main(String[] args) {
T t1 = new T();
t1.f2();
}
}
class T{
//访问成员方法的语法:this.方法名(参数列表);
public void f1() {
System.out.println("f1()方法..");
}
public void f2() {
System.out.println("f2()方法..");
//调用被类的f1方法
//第一种方式
f1();
//第二种方式
this.f1();
这两种调用是有区别的
}
}
- 注意这两种调用方式是有区别的
- 访问构造器语法
this(参数列表);
- 注意
- 只能在构造器中使用(即只能在构造器中访问另外一个构造器)
- 如果有this(参数列表) ——访问构造器的语法,必须放在第一条语句
package This_Practice;
public class ThisDetail {
public static void main(String[] args) {
T t1 = new T();
t1.f2();
}
}
class T{
/*
* 只能在构造器中使用(即只能在构造器中访问另外一个构造器)
* 注意:
* 如果有this(参数列表) ——访问构造器的语法,必须放在第一条语句
*/
public T() {
//这里去访问 T(String name,int age),
this("jack",100);
System.out.println("T()构造器");
}
public T(String name,int age) {
System.out.println("T(String name,int age)构造器");
}
//访问成员方法的语法:this.方法名(参数列表);
public void f1() {
System.out.println("f1()方法..");
}
public void f2() {
System.out.println("f2()方法..");
//调用被类的f1方法
//第一种方式
f1();
//第二种方式
this.f1();
}
}
- this不能在类定义的外部使用,只能在类定义的方法中使用
package This_Practice;
public class ThisDetail {
public static void main(String[] args) {
T t1 = new T();
t1.f2();
System.out.println();
t1.f3();
}
}
class T{
String name = "jack";
int age = 10;
/*
* 只能在构造器中使用(即只能在构造器中访问另外一个构造器)
* 注意:
* 如果有this(参数列表) ——访问构造器的语法,必须放在第一条语句
*/
public T() {
//这里去访问 T(String name,int age),
this("jack",100);
System.out.println("T()构造器");
}
public T(String name,int age) {
System.out.println("T(String name,int age)构造器");
}
//访问成员方法的语法:this.方法名(参数列表);
public void f1() {
System.out.println("f1()方法..");
}
public void f2() {
System.out.println("f2()方法..");
//调用被类的f1方法
//第一种方式
f1();
//第二种方式,通过this访问方法
this.f1();
}
//通过this 关键字可以用来访问本类的属性、方法、构造器
public void f3() {
String name = "smith";
int age = 30;
//传统方式,遵循就近原则,有没有同名的局部变量
System.out.println("name=" + name +"\nage=" + age);//输出smith,30
//this关键字访问
System.out.println("name=" + this.name +"\nage=" + this.age);//输出属性,jack,10
}
}
运行效果
练习
题目:定义 Person 类,里面有 name、age 属性,并提供 compareTo 比较方法,用于判断是否和另一个人相等,提供测试类 TestPerson,用于测试, 名字和年龄完全一样,就返回 true, 否则返回 false
package This_Practice;
public class ThisExercise {
public static void main(String[] args) {
TestPerson p = new TestPerson();
p.test();
}
}
//定义 Person 类,里面有 name、age 属性,并提供 compareTo 比较方法,用于判断是否和另一个人相等,提供测试类 TestPerson
//用于测试, 名字和年龄完全一样,就返回 true, 否则返回 fals
/*
* person 类
* 属性:姓名,年龄
* 方法:比较两个人是否一样
*/
class Person{
String name;
int age;
//构造器
public Person(String name,int age){
this.name = name;
this.age = age;
}
public boolean compareTo(Person p) {
//用当前的成员变量的值对比 传进来的对象成员变量的值,是就是return true,否就return flase
// if(this.name.equals(p.name) && this.age == p.age) {
// return true;
// }else {
// return false;
// }
return this.name.equals(p.name) && this.age == p.age;
}
}
class TestPerson{
public void test() {
Person p1 = new Person("小杨",21);
Person p2 = new Person("小杨",21);
if(p1.compareTo(p2)) {
System.out.println("是同一个人");
}else {
System.out.println("不是同一个人");
}
}
}