this关键字和super关键字
1749字约6分钟
2024-12-02
this关键字
this
指向的是自己本身,也就是自己这个类里面的属性this 是默认添加的,即使是不加 this,也会有一个默认添加的 this(也就是说你不写this关键字,类里面也会有this关键字,但是他是隐藏的)。但是不添加的话,如果形参名和成员变量名相同就会有问题。
class Person {
// this访问属性
String name;
int age;
public Person(String name, int age) {
// this.name 表示的是当前类中的name,也就是Person这个类下面的name(全局变量)
// this.name = name; 等于的 name就是构造器形参里面的name
// 所以这样就达到了形参的名字与全局变量中的属性名的名字一样
// 而且构造器中的值还能正常赋值给全局变量
// 也就是把构造器中的形参参数的值赋值给全局变量
this.name = name;
this.age = age;
// this的哈希值为 366712642
System.out.println("Person.this.hashCode:" + this.hashCode());
}
}
public class this01 {
public static void main(String[] args) {
Person p1 = new Person("Hello", 20);
// Person类的哈希值为 366712642
System.out.println("p1.hashCode:" + p1.hashCode());
}
}
所以根据上面的代码可以发现 Person
这个类和 Person
类中的 this
关键字,它们的哈希值是一样的,所以由此可证,this
关键字就是指向自己所在的类的
小结:简答来说就是那个对象调用,this
就代表那个(说白了就是指向自己所在的类方法里)
this关键字的使用细节
this
会优先调用本类中的属性和方法,如果本类中没有调用的属性和方法,则会去调用父类中的属性和方法(父类中的私有属性和方法不能被调用),如果父类中也没有调用的属性和方法,则会去调用超类,依次类推利用
this
关键字来调用别的方法class This { public void This1() { System.out.println("This1方法已被调用。"); } public void This2() { System.out.println("This2方法已被调用。"); /* 这两个调用方法是有区别的 */ // 直接调用 This1(); // 通过this方法调用 this.This1(); } } public class this02 { public static void main(String[] args) { This t = new This(); t.This2(); System.out.println("This结束"); } }
利用
this
关键字调用别的构造器class This { public This() { // 调用构造器 /* 注意事项 如果想用this关键字去调用别的构造器 前提是该this关键字只能在构造器中使用 this语句调用别的构造器要放在第一条 */ this("张三", 18); } public This(String name, int age) { System.out.println(name); System.out.println(age); } } public class this02 { public static void main(String[] args) { This t = new This(); t.This2(); System.out.println("This结束"); } }
利用
this
方法,判断两个人的信息,判断是否相同// 比较两个人的信息,看是否是同一个人 class compare { String name; int age; public compare(String name, int age) { this.name = name; this.age = age; } public boolean compare01(compare a) { // if (this.name.equals(a.name) && this.age == (a.age)) { // return true; // } else { // return false; // } // 简化之后 return this.name.equals(a.name) && this.age == (a.age); } } public class ThisExercise01 { public static void main(String[] args) { compare p1 = new compare("张三", 20); compare p2 = new compare("张三", 20); // 上面两行代码都分别创建了不同的对象 // 并且都把构造器里面的值赋值到了全局变量中 // 然后下面这行代码就是把对象p2赋值到对象p1中 // 然后进行比较,然后在返回结果输出 System.out.println("p1和p2比较的结果为: " + p1.compare01(p2)); } }
super关键字
super
关键字的细节
this
只能出现在构造方法和实例方法(这个实例方法也就是不带static
关键字的方法)之中,代表的是当前正在调用这个方法的对象super
在构造器中是默认存在的,前提是构造器中没有this
语句,因为如果你输入了this
语句那么该语句就会替换掉默认的super
语句super
也只能出现在构造方法和实例方法中,代表的是当前对象的父类型特征super
必须放在构造器中的第一行(super
只能在构造器中使用 ),this
也是必须放在构造器中的第一行,所以super
和this
不能写在一起,在构造器中如果写了this
方法,那么默认的super
方法就会被this
替换掉
super
调用属性和方法的细节
- super调用属性的细节和调用方法的细节是一样的;如果super调用的方法或则属性在父类中没有找到,那么就到父类的父类中继续查找
- 当创建子类对象时,不管使用子类的哪一个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪一个构造器完成对父类的初始化,否则编译不会通过。
- 只要父类中创建的有构造器,就需要自己在子类中指定父类的构造器(super)
- 父类中没有构造器,子类中有构造器,可以
- 父类中有构造器,子类中没有构造器,不可以
代码文档:
public class Test {
public static void main(String[] args) {
B b = new B();
}
}
class A {
A() {
System.out.println("a");
}
A(String name) {
System.out.println("a name");
}
}
class B extends A {
B() {
// 该构造器中之所以没有默认的super是因为有了this
// this和super不能在一起使用
// 所以这里就不会调用父类中的无参构造器,从而调用本类中的构造器
// this调用完之后则继续往下运行
this("abs");
System.out.println("b");
}
B(String name) {
// super在构造器中是默认存在的,即使你不写他都存在,super是指向父类的构造器
// 而super()是默认存在的且没有显示,这就是为什么构造器调用父类构造器时默认调用的是无参构造器
// 而上面的this调用B构造器
// 所以就B构造器中没有this方法,所以就默认调用了A类中的无参构造器
// 调用完之后就继续执行下一条语句
super();
// 如果你用this调用构造器,那么该构造器中则不能在使用super去调用父类的构造器了
// 同理,你用super调用构造器,那么该构造器中则不能在使用this去调用别的构造器了
// 这里的this调用的时普通方法,所以不会影响到super
this.C("hello");
System.out.println("b name");
}
public void C(String name) {
System.out.println(name);
}
}
super 和 this的区别
总结:this优先从本类中开始找,而super则优先从父类中开始找