一、this 与 super 的地位
首先我们需要回忆一个概念,所有对象的父类都是 Object 类,这就意味着,所有的对象实例化的时候都需要先调用 Object 的无参构造方法。
而连接对象和 Object 至少需要一条道路,而 this 和 super 就是这个最重要的工兵,逢山开路,遇水搭桥。
而 this 和 super 两个往往身藏功与名,默默无闻,很多情况都可以省略。
比如:
- 本类方法调用本类属性
- 本类方法调用另一个本类方法
- 子类构造方法隐含调用 super()
二、类创建的过程
任何类在创建之初,都有一个默认的无参构造方法,它是 super() 的一条默认通路。构造方法的参数列表决定了调用通路的选择;如果子类指定调用父类的某个构造方法,super 就会不断的向上溯源(每个对象必然是继承一个父类,这块地意思就是沿着一层一层的路径找到 Object 类);如果没有指定,则调用 super() 。如果父类没有提供默认的构造方法,子类在继承时就会编译错误。
class Father{
public Father(int a){
}
}
//这块就会报错,因为子类没有明确的指定继承父类的某个构造方法,而且父类也没有默认的无参构造方法
class Son1 extends Father{
}
//正确的方式
class Son2 extends Father{
public Son2{
super(1);
}
}
如果父类坚持不提供无参的构造方法,就必须如上图的Son2类的无参构造方法中使用 super 方式调用父类的某个有参构造方法。
2.1 this 的作用
一个实例变量可以通过 this. 赋值另一个实例变量;一个实例方法可以通过 this. 调用另一个实例方法;甚至一个构造方法也可以通过 this. 调用另一个构造方法。
2.2 super的作用
1、普通的直接引用
与this类似,super相当于是指向当前对象的父类,这样就可以用http://super.xxx来引用父类的成员。
2、子类中的成员变量或方法与父类中的成员变量或方法同名。
3、引用构造函数
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
2.3 this 和 super 使用注意
(1) 如果 this 和 super 指代构造方法,则必须位于方法体的第一行。换句话说,在一个构造方法中,this 和 super 只能出现一个,且只能出现一次,否则在实例化对象时,会因为子类调用多个构造方法而造成混乱。
(2) 由于 this 和 super 都在实例化阶段调用,所以不能在静态方法和静态代码块中使用 this 和 super 关键字。
(3) this 还可以值代当前对象,比如在同步代码块 synchronized(this){....}中,super 就不具备这种能力。但是 super 也有自己独特的功能,在子类覆盖父类方法的时候,可以使用 super 调用父类的同名方法。
3、 总结