首页 > 技术文章 > this和super

anni-qianqian 2016-02-14 16:39 原文

1.this

* 每个类的每个非静态方法(没有被static修饰)都会隐含一个this引用名称,它指向调用这个方法的对象。
* 当在方法中使用本类的属性时,都会隐含地使用this名称,当然也可以明确指定。
* this可以看作是一个变量,它的值就是当前对象的引用
* this.属性/方法   表示调用当前属性或方法

例:

//Person类的构造方法
public Person(String name, boolean sex, int age){
    this.name = name;
    this.sex = sex;
    this.age = age;
}

2.this+构造方法

* 如果某个构造方法的第一条语句具有形式this(...),那么这个构造方法将调用本类中的其他构造方法。
* this(xxxx);   构造函数的调用, 注意点:this(xxx) 必须是第一行

例:

//Person类的构造方法1
public Person(String name, boolean sex, int age){
    this.name = name;
    this.sex = sex;
    this.age = age;
}
    
//构造方法2-调用构造方法1
public Person(){
    this("张三","男",18);
}

3.super

* super代表父类的对象
* super只能在类的内部使用
* super可以跳过一层继承调用,即调用父类的父类
* 在Java类中使用super来引用父类的成分
* super可用于访问父类中定义的属性
* super可用于调用父类中定义的成员方法
* super可用于在子类构造器中调用父类的构造器

**super只能应用在成员方法和构造方法中,不能应用在静态方法中(和this是一样的),如果在构造方法中使用必须放在第一行**

例:

>Father类

public Father(String fatField){
    this.fatField = fatField;
}

eat(){}

>son类

private String sonField;
public Son(String field){
    //super();  //默认调用空参的父类构造函数
    super(field);  //调用父类的带参数的构造函数
    this.sonField = field;
}

eat(){
    super.eat(); //调用父类的成员方法,不需要放在第一行
    其他方法
}

4.注意

##为什么子类会自动调用父类的构造函数???
原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super();
解释:
super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数。子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。
特注:
1、子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();
2、若父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数;
3、若子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

5.this和super关键字对比

推荐阅读