一、super关键字
1、super父类对象引用
super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。
若是构造方法的第一行代码没有显式的调用super(…)或者this(…);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。(涉及到继承树)
2、super关键字的使用
示例:
/**
*
* @Title: TestSuper.java
* @Package test
* @Description: TODO(super关键字的使用)
* @author Charlie
* @date 2019年1月23日
* @version V1.0
*/
package test;
/**
* @ClassName: TestSuper
* @Description: TODO(super关键字的使用)
* @author Charlie
* @date 2019年1月23日 下午5:45:58
*
*/
public class TestSuper {
/**
* @Title: main
* @Description: TODO(super关键字的使用)
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
new ChildClass().f();
}
}
/**
*
* @ClassName: FatherClass
* @Description: TODO(定义父类)
* @author Charlie
* @date 2019年1月23日 下午5:47:14
*
*/
class FatherClass{
public int value;
//定义一个父类方法f
public void f() {
value = 100;
System.out.println("FatherClass.value=" + value);
}
}
/**
*
* @ClassName: ChildClass
* @Description: TODO(定义一个子类,继承父类FatherClass)
* @author Charlie
* @date 2019年1月23日 下午5:50:01
*
*/
class ChildClass extends FatherClass{
public int value;
//重写父类的f()方法
public void f() {
super.f(); //调用父类的f()方法
value = 200;
System.out.println("ChildClass.value=" + value);
System.out.println(value);
System.out.println(super.value); //调用父类的成员对象
}
}
运行结果:
注:使用super指向父类的对象。
二、继承树追溯
1、属性/方法查找顺序:(比如:查找变量h)
1、 查找当前类中有没有属性h
2、 依次上溯每个父类,查看每个父类中是否有h,直到Object
3、 如果没找到,则出现编译错误。
4.、上面步骤,只要找到h变量,则这个过程终止。
2、构造方法调用顺序:
构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
注:静态初始化块调用顺序,与构造方法调用顺序一样,不再重复。
所有的构造方法的第一句总是super();调用构造器
3、构造方法向上追溯执行测试
示例:
/**
*
* @Title: TestSuper.java
* @Package test
* @Description: TODO(构造方法向上追溯执行测试)
* @author Charlie
* @date 2019年1月23日
* @version V1.0
*/
package test;
/**
* @ClassName: TestSuper
* @Description: TODO(构造方法向上追溯执行测试)
* @author Charlie
* @date 2019年1月23日 下午6:11:59
*
*/
public class TestSuper {
/**
* @Title: main
* @Description: TODO(构造方法向上追溯执行测试)
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
System.out.println("开始创建一个ChildClass对象");
new ChildClass();
}
}
/**
*
* @ClassName: FatherClass
* @Description: TODO(定义父类)
* @author Charlie
* @date 2019年1月23日 下午6:14:02
*
*/
class FatherClass{
public FatherClass(){
super(); //不写这句话,编译器会默认添加(写不写都可以)
System.out.println("创建FatherClass");
}
}
/**
*
* @ClassName: ChildClass
* @Description: TODO(创建ChildClass)
* @author Charlie
* @date 2019年1月23日 下午6:15:18
*
*/
class ChildClass extends FatherClass{
public ChildClass() {
super(); //不写这句话,编译器会默认添加(写不写都可以)
System.out.println("创建ChildClass");
}
}
运行结果:
注:继承树的顺序
ChildClass继承了FatherClass,FatherClass继承了Object.
创建子类对象,会追溯到Object类,创建Object类对象,返回给FatherClass;FatherClass创建好对象,再返回给ChildClass,ChildClass再创建好对象。从上往下依次执行(Object类→父类→子类)。
super();永远位于构造器的第一句。