java学习笔记24:super关键字、继承树追溯

一、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关键字的使用
注:使用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();永远位于构造器的第一句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值