目录
本篇内容给大家带来this和super关键字的特性,从而更能清楚的区分开来它们的区别以及能够在日常开发中学会使用它们。
this关键字
this是什么?干什么的?
通俗的来说this是指当前对象。可以通过this关键字来调用当前对象的属性,方法以及构造器。同时在有参构造器中也是通过this来对全局属性进行赋值。
this关键字调用成员变量
可以通过this调用成员变量,解决了局部变量名称的冲突问题。
语法格式:
this.属性名;
示例代码如下:
public class Person {
String name;
int age;
String sex;
/*Person类有参构造器*/
public Person(String name, int age, String sex) {
this.name = name; //使用this关键字调用成员变量对其进行赋值
this.age = age;
this.sex = sex;
}
}
由上可以看到this可以区分局部变量以及全局变量。
this关键字调用成员方法
可以在一个方法中调用本类中的另一个方法。
语法格式
this.方法名([参数1],[参数2]...);
示例代码如下:
public class Person {
public void method1(){
this.method2();// this关键字调用本类的method2方法。
System.out.println("Person类中的method1方法");
}
public void method2(){
System.out.println("Person类中的method2方法");
}
}
this关键字调用构造器
可以通过this关键字调用本类的构造器。
语法格式:
this([参数1],[参数2]...);
示例代码如下:
public class Person {
String name;
int age;
public Person() {
System.out.println("Person类的无参构造器被执行了...");
}
public Person(String name, int age) {
this(); //this关键字调用本类的无参构造器
this.name = name;
this.age = age;
System.out.println("Person类的有参构造器被执行了...");
}
}
测试:
public class PersonTest {
public static void main(String[] args) {
Person person = new Person("张三", 19);
}
}
控制台打印:
Person类的无参构造器被执行了...
Person类的有参构造器被执行了...
由测试打印结果可以得知,可以使用this关键字调用本类的构造器。
注意:this调用构造器时必须方法构造器的首行位置。
拓展
当使用this关键字调用本类的属性,方法时,如果本类没有,会出现什么情况?
示例代码如下:
public class Person {
String name="张三";
int age=19;
public void personMethod(){
System.out.println("Person类的方法");
}
}
/*继承Person类*/
class Student extends Person{
String grade;
public void testMethod(){
//本类没有该属性会调用父类的属性
System.out.println(this.name);
System.out.println(this.age);
//本类没有该方法会调用父类的方法
this.personMethod();
}
}
测试:
public class PersonTest {
public static void main(String[] args) {
Student student = new Student();
student.testMethod();
}
}
控制台打印结果:
张三
19
Person类的方法
由控制台打印结果可以得出:
- 当使用this访问本类的属性时,如果本类没有此属性则从父类继续查找。
- 当使用this访问本类的方法时,如果本类没有此方法则从父类继续查找。
到这有的人可能会说,this为什么不去调用父类构造器?前几篇文章讲解了,创建子类对象时会默认去先调用父类的无参构造器。如果使用super关键字可以显式的调用。那接下来给大家讲解一下super关键字吧!
super关键字
super关键字可以访问父类的成员变量,成员方法和构造器
super关键字调用父类的成员变量
语法格式:
super.属性名;
super关键字调用父类的成员方法
super.方法名([参数1],[参数2]...);
super关键字调用父类的构造器
super([参数1],[参数2]...);
示例代码如下:
public class Person {
String name;
int age;
/*父类的有参构造器*/
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Person类的有参构造器被执行...");
}
/*父类的成员方法*/
public void personMethod(){
System.out.println("Person类的方法");
}
}
/*继承Person类*/
class Student extends Person{
String name;
String grade;
/*子类无参构造*/
public Student() {
super("张三",19); //调用父类的有参构造器
System.out.println("Student类的无参构造器被执行了...");
}
public void studentMethodTest(){
super.personMethod(); // 调用父类的方法
System.out.println(super.name); //调用父类的属性
}
}
测试:
public class PersonTest {
public static void main(String[] args) {
Student student = new Student();
System.out.println("=====================");
student.studentMethodTest();
}
}
控制台打印结果:
Person类的有参构造器被执行...
Student类的无参构造器被执行了...
=====================
Person类的方法
张三
注意:
- super调用构造器时必须方法构造器的首行位置。
- this和super调用构造器不能同时出现。
- super访问父类成员,父类没有该成员则向上查找(父类),直到找到为止,否则报错。
总结
this和super比较
功能 | this | super |
---|---|---|
访问属性 | 访问本类属性 如若没有则向上查找 | 访问父类属性 如若没有则向上查找 |
访问方法 | 访问本类方法 如若没有则向上查找 | 访问父类方法 如若没有向上查找 |
调用构造器 | 调用本类构造器 必须放在构造器首行 | 调用父类构造器 必须放在子类构造器首行 |
含义 | this表当前对象 | super表父类对象 |
本篇主要讲解了this和super关键字的使用方法,以及需要注意的细节,同时后面将this和super做了比较。在日常开发中熟练正确使用关键字可以让代码更简洁,提供开发效率。