Java__继承中父类与子类之间调用的先后顺序

继承可以简化代码,提高代码的利用率,但是通常用于同一类事物,且有多个共同的属性或功能时才考虑继承。本文主要说明Java中父类在被子类调用后内部模块与子类出现的先后顺序来判定继承中父类与子类的优先级问题。

    首先在子类中分别定义静态代码块、非静态代码块、无参构造器、静态方法与非静态方法。

class A extends B{
	/**
	 * 子类静态代码块
	 */
	static {
		System.out.println("----staticA--1--------");
	}
	/**
	 * 子类代码块
	 */
	{
		System.out.println("---------2------");
	}
	/**
	 * 子类无参构造器
	 * 赋初值
	 */
	public A() {
		super();//默认不写
		System.out.println("-----A--3---------");
	}
	/**
	 * 非静态方法buy
	 */
	public void buy() {
		System.out.println("-------buy--4---------");
	}
	/**
	 * 静态方法method
	 */
	public static void method() {
		System.out.println("------method----5---------");
	}
}

    父类中同样定义静态代码块、非静态代码块、无参构造器、静态方法与非静态方法。

class B{
	/**
	 * 父类静态代码块
	 */
	static {
		System.out.println("----staticB--6--------");
	}
	/**
	 * 父类代码块
	 */
	{
		System.out.println("--------7------");
	}
	/**
	 * 父类无参构造器
	 * 赋初值
	 */
	public B() {
		System.out.println("----B---8---------");
	}
	/**
	 * 非静态方法run
	 */
	public void run() {
		System.out.println("-----run----9---------");
	}
	/**
	 * 静态方法good
	 */
	public static void good() {
		System.out.println("----good------10---------");
	}
}

    给A创建一个对象a

public static void main(String[] args) {
		A a = new A();
	}

    运行结果:

----staticB--6--------
----staticA--1--------
--------7------
----B---8---------
---------2------
-----A--3---------

    结果分析:由此可以看出运行父类中的静态代码块有优先于子类,而上述运行–7--和–B--8–在--2–和--A–3--的前面是因为在运行无参构造器A的时候父类隐藏属性super()优先执行把运行对象转接到父类B上,而因为代码块的优先级又高于无参构造器,故—7---在–B--8–前面,等B运行结束后,才返回A继续执行,同理,先打印处–2--,接着打印出—A---3—。

    接着添加A.good();a.run();a.buy();A.method();四组调用(非静态:只能通过对象调用,因为非静态的属性或方法只有在创建对象的时候才会被加载进内存。静态:既可以通过对象调用,也可以通过类名调用,建议使用类名调用)

public static void main(String[] args) {
		A a = new A();
		A.good();
		a.run();
		a.buy();
		A.method();	
	}

    运行结果:

----staticB--6--------
----staticA--1--------
--------7------
----B---8---------
---------2------
-----A--3---------
----good------10---------
-----run----9---------
-------buy--4---------
------method----5---------

    结果分析:由于对象a与类A在调用和继承并无先后顺序故调用方法先后顺序与其运行先后顺序一致。
完整代码块:

package cn.yunhe.extend;

public class PracticeDemo {

	public static void main(String[] args) {
		A a = new A();
	
		A.good();
		a.run();
		a.buy();
		A.method();	
	}

}
/**
 *	A继承B
 */
class A extends B{
	/**
	 * 子类静态代码块
	 */
	static {
		System.out.println("----staticA--1--------");
	}
	/**
	 * 子类代码块
	 */
	{
		System.out.println("---------2------");
	}
	/**
	 * 子类无参构造器
	 * 赋初值
	 */
	public A() {
		super();//默认不写
		System.out.println("-----A--3---------");
	}
	/**
	 * 非静态方法buy
	 */
	public void buy() {
		System.out.println("-------buy--4---------");
	}
	/**
	 * 静态方法method
	 */
	public static void method() {
		System.out.println("------method----5---------");
	}
}
class B{
	/**
	 * 父类静态代码块
	 */
	static {
		System.out.println("----staticB--6--------");
	}
	/**
	 * 父类代码块
	 */
	{
		System.out.println("--------7------");
	}
	/**
	 * 父类无参构造器
	 * 赋初值
	 */
	public B() {
		System.out.println("----B---8---------");
	}
	/**
	 * 非静态方法run
	 */
	public void run() {
		System.out.println("-----run----9---------");
	}
	/**
	 * 静态方法good
	 */
	public static void good() {
		System.out.println("----good------10---------");
	}
}

    无评有赞,感谢观看!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值