Java中this和super关键字的使用


  

引言:

Java中this和super关键字的使用。this可用来调用本类中的属性、方法、构造器;super可以用来调用父类中的属性方法构造器。

一、this关键字的使用

  1. this可以用来修饰、调用:属性、方法、构造器

  2. this修饰属性和方法:this理解为当前对象或当前正在创建的对象

    • 在类的方法中,我们可以使用”this.属性”或”this.方法”的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略”this.”。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用”this.变量”的方式,表明此变量是属性,而非形参。
    • 在类的构造器中,我们可以使用”this.属性”或”this.方法”的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都选择省略”this.”。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式的使用”this.变量”的方式,表明此变量是属性,而非形参。
  3. this调用构造器:
      ① 我们在类的构造器中,可以显式的使用”this(形参列表)”方式,调用本类中指定的其他构造器
      ② 构造器中不能通过”this(形参列表)”方式调用自己
      ③ 如果一个类中有n个构造器,则最多有n-1个构造器中使用了”this(形参列表)”
      ④ 规定:“this(形参列表)”必须声明在当前构造器的首行
      ⑤ 构造器内部,最多只能声明一个”this(形参列表)”,用来调用其他的构造器

二、super关键字的使用

  1. super理解为父类的

  2. super关键字可以用来调用:属性、方法、构造器

  3. super调用属性和方法:

    • 我们可以在子类的方法或构造器中。通过使用”super.属性”或”super.方法”的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略”super.”
    • 特殊情况:当子类和父类中定义了同名的属性时(注意:子类的属性不会像方法那样被重写覆盖),我们要想在子类中调用父类中声明的属性,则必须显式的使用”super.属性”的方式,表明调用的是父类中声明的属性。
    • 特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用”super.方法”的方式,表明调用的是父类中被重写的方法。
  4. super调用构造器:
      ① 我们可以在子类的构造器中显式的使用”super(形参列表)”的方式,调用父类中声明的指定的构造器
      ② “super(形参列表)”的使用,必须声明在子类构造器的首行!
      ③ 我们在类的构造器中,针对于”this(形参列表)”或”super(形参列表)”只能二选一,不能同时出现
      ④ 在构造器的首行,没有显式的声明”this(形参列表)”或”super(形参列表)”,则默认调用的是父类中空参的构造器:super()
      ⑤ 在类的多个构造器中,至少有一个类的构造器中使用了”super(形参列表)”,调用父类中的构造器

package com.yczlab;

public class Person {
    String name;
    int age;
    int id = 1001;//身份证号

    public Person() {
    	System.out.println("Person的空参构造器被调用");
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, int age) {
        this(name);
        this.age = age;
    }

    public void eat() {
        System.out.println("人:吃饭");
    }

    public void walk() {
        System.out.println("人:走路");
    }
}
package com.yczlab;

public class Student extends Person {

    String major;
    int id = 1002;//学号(注:属性不会像方法那样被覆盖(重写),内存中会用两个id,一个是来自父类,一个来自本身

    public Student() {
		//该地方虽然没有显示的调用super(),但是会默认调用super()
    }

    public Student(String major) {
    	//这个地方没有显示的调用"this(形参列表)"或"super(形参列表)",则实际上默认调用super()
        this.major = major;
    }

    public Student(String name, int age, String major) {
        super(name, age);//调用父类的构造器
        this.major = major;
    }

    @Override
    public void eat() {
        System.out.println("学生:吃有营养的食物");
    }

    public void study() {
        System.out.println("学生:学习知识");
        eat();//this.eat() 调用的是子类重写的方法
        super.eat();//调用的是父类的方法
        walk();//等价于this.walk(),等价于super.walk()
    }

    public void show() {
        //使用this.name或者super.name差别不大
        System.out.println("name = " + this.name + ", " + super.age);
        //使用this.id和super.id差别很大
        System.out.println("身份证号:" + super.id);//调用父类中的id属性
        System.out.println("学号:" + this.id);//调用子类中的id属性
        System.out.println("学号:" + id);//默认是省略了this,实际上是使用的this.id
    }
}
package com.yczlab;

public class SuperTest {
    public static void main(String[] args) {
        Student student = new Student();
        student.study();
        student.show();

        System.out.println("*************8");

        Student student1 = new Student("Tom", 19, "计算机");
        student1.show();
    }
}

文章作者: YangChongZhi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YangChongZhi !
评论
 上一篇
Java子类对象实例化的全过程 Java子类对象实例化的全过程
   引言: Java中子类对象的实例化全过程分析。 从结果上来看:(继承性) 子类继承父类以后,就获取了父类中声明的属性或方法。 创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。 从过程上来看:   当我们通过子
2020-12-31
下一篇 
Java权限修饰符 Java权限修饰符
   引言: Java中的权限修饰符(private、缺省、protected、public)   Java权限修饰符public、protected、private置于类的成员定义前,用来限定对象对该类成员的访问权限。 修饰符 类
2020-12-30
  目录