java中this 和 super 的用法区别

this

this是指向自身的一个对象,代表对象本身。
三种用法:

  • 普通的直接引用,指向当前对象本身
  • 形参与成员变量重名,用this来指向成员变量
class Person {
    private int age = 10;
    public Person(){
    System.out.println("初始化年龄:"+age);
}
    public int GetAge(int age){
        this.age = age;
        return this.age;
    }
}
  • 引用构造函数(当前对象的其他构造函数)

super

指向当前对象的父类,可以用super.xxx来引用父类的成员

  • 子类中的成员变量与父类中成员变量相同时,可以用super.xxx取得父类的成员变量
class Person {
    String name;

    public void value() {
        this.name = "tom";
    }
}

class Student extends Person {

    String name;

    public void value() {
        name = "jack";
        super.value();
        System.out.println(name);
        System.out.println(super.name);
    }
}

public class studySuperAndThis{
    public static void main(String[] args) {
        Student student = new Student();
        student.value();
    }
}
  • 引用构造函数
    super(参数):调用父类的构造函数(应该为构造函数中的第一条语句)
    this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)
class Person {
    public static void prt(String s) {
        System.out.println(s);
    }

    Person() {
        prt("父类·无参数构造方法: " + "A Person.");
    }//构造方法(1)

    Person(String name) {
        prt("父类·含一个参数的构造方法: " + "A person's name is " + name);
    }//构造方法(2)
}

class Chinese extends Person {
    Chinese() {
        super(); // 调用父类构造方法(1)
        prt("子类·调用父类“无参数构造方法”: " + "A chinese coder.");
    }

    Chinese(String name) {
        super(name);// 调用父类具有相同形参的构造方法(2)
        prt("子类·调用父类”含一个参数的构造方法“: " + "his name is " + name);
    }

    Chinese(String name, int age) {
        this(name);// 调用具有相同形参的构造方法(3)
        prt("子类:调用子类具有相同形参的构造方法:his age is " + age);
    }
}

注意:

  1. super() 必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句都是隐含调用super()。如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
  2. this 和 super 不会出现在同一个构造函数中,因为你this调用的是本类的其他构造函数,而本类的其他构造函数又必然含有super,在同一个构造函数中出现相同的语句,就失去了语句的意义,编译也不会通过。
  3. super 和 this 都是指向对象的,所以均不可在static环境中使用,包括static方法、static变量、static语句块
  4. super是java的关键字,this是指向本对象的指针
上一篇:Scanner学习


下一篇:Java super关键字