昨天看到群里面有人分享了一道题目,我答错了,于是趁机了解了下Java的类/对象初始化过程:
程序A主要考察的是类实例初始化。简单验证了下,类实例初始化过程如下:
程序B考察的则是类初始化。类初始化的过程如下:
但是我们必须做到面向接口编程,而不是面向实现编程(Program to an ‘interface’, not an ‘implementation’)。
于是就得看看Java Language Specification了。其中类初始化过程如下:
可以看到JLS确实规定了父类先初始化(7)、static块和类变量赋值按照文本顺序来(9)。
欢迎加入Java技术交流Qqun:963944895
然后看看类实例的初始化:
JLS特意提到,如果子类覆盖了父类的方法,则在构造函数中,调用的方法也是子类的。
接下来一个一个看代码:
// 程序A
// 父类
class Parent {
int i = 1;
Parent() {
System.out.println(i);
int x = getValue();
System.out.println(x);
}
{i = 2;}
protected int getValue() {return i;}
}
// 子类
class Son extends Parent {
int j = 1;
Son() {j = 2;}
protected int getValue() {return j;}
}
class Test {
public static void main(String[] args) {
Son son = new Son();
System.out.println(son.getValue());
}
}
所以,程序A的输出是:
2
0
2
接下来看程序B:
// 程序B
public class MagimaTest {
public static void main(String[] args) {
magimaFunction();
}
static MagimaTest st = new MagimaTest();
static {
System.out.println("1");
}
{
System.out.println("2");
}
MagimaTest() {
System.out.println("3");
System.out.println("a=" + a + ",b=" + b);
}
public static void magimaFunction() {
System.out.println("4");
}
int a = 110;
static int b = 112;
}
所以输出是:
2
3
a=110,b=0
1
4
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有