类属性和构造函数 在继承关系中的执行顺序

本文探讨了Java中类继承时构造函数与方法调用的顺序及特殊情况,尤其是在子类重写父类方法时可能出现的问题。通过具体示例展示了不同构造函数和方法调用时的执行流程,并解释了为何子类构造函数中调用被重写的方法会得到意外的结果。

类属性和构造函数 在继承关系中的执行顺序:

class A {
	public String ss="a";
	public A() {
		System.out.println("Con-A:"+ss);
		fun();
	}
	public void fun() {
		System.out.println("fun-a:"+ss);
	}
}

public class B extends A{
	public String ss="B";
	public static void main(String[] args) {
		B b= new B();
		//A a = new A();
	}
	public B() {
		System.out.println("Con-B:"+ss);
		fun();
	}
	public void fun() {
		System.out.println("fun-B:"+ss);
	}
}

 

打印出来的结果是:

Con-A:a

fun-B:null   // 估计你也没想到吧?

Con-B:B

fun-B:B

 

如果将main方法改造下:

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

 输出结果是:

Con-A:a

fun-a:a

 

上面红色处,谁能给出原因?

 

经过断点调试,原来是在A构造里调用的fun 是B类的fun(被重写了)。而 至于 null ,为什么,谁能解释?

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值