今天,在手机上做面试题,是有关类的初始化。
这里直接上代码:
public class test8 extends A{
test8(){
super("B");
System.out.print("B");
}
public static void main(String[] args) {
new test8();
}
}
class C{
C(){
System.out.print("C");
}
}
class A{
C c = new C();
A(){
this("A");
}
A(String s){
System.out.print(s);
}
}
打印结果为:CBB
上面是一个简单的例子,首先初始化类test8,这里会调用该类的无参构造方法,在无参构造方法
调用了超类中带参数的构造方法(继承了类A),而在类A中,又创建了C类的对象c,根据打印的
结果说明:c对象的创建在类A的构造函数调用之前,也就是说在调用super('B')时,会先初始化
成员变量。(这么说不知道对不对)
下面再给出一个详细的例子来说明:
public class test1 {
public static void main(String[] args) {
C c = new C();
}
}
class A{
int a = 0;
Method m = new Method(a);
static int a1 = 10;
static{
System.out.println("A:执行静态代码块A"+a1);
}
{
System.out.println("非静态代码块A");
}
public A(){
System.out.println("a:"+ a);
}
}
class B extends A{
int b = 1;
Method m = new Method(b);
static int b1 = 20;
static{
System.out.println("B:执行静态代码块B"+b1);
}
{
System.out.println("非静态代码块B");
}
public B(){
System.out.println("b:"+ b);
}
}
class C extends B{
int c = 2;
Method m = new Method(c);
static int c1 = 30;
static{
System.out.println("C:执行静态代码块C"+c1);
}
{
System.out.println("非静态代码块C");
}
public C(){
System.out.println("c:"+ c);
}
}
class Method{
public Method(int i){
System.out.println("打印数据:" + i);
}
}
打印结果为:
这里分析一下:在主函数创建类C的对象并初始化的过程:
1、C类继承B类、B类继承A类,A是B的父类,B是C的父类;
2、调用A类的静态代码块和静态变量,打印“A:执行静态代码块A10”
3、调用B类的静态代码块和静态变量,打印"B:执行静态代码块B20"
4、调用C类的静态代码块和静态变量,打印"C:执行静态代码块C30"
5、调用A类的普通成员变量和代码块,再调用A类的构造方法
6、调用B类的普通成员变量和代码块,再调用B类的构造方法
7、调用C类的普通成员变量和代码块,再调用C类的构造方法,打印完毕
这里我们可以看出类的初始化过程,首先按照顺序初始化父类中的静态变量和静态代码块,然后
初始化子类中的静态变量和静态代码块,再就是初始化父类中的普通成员变量和代码块,再调用
父类的构造方法,最后初始子类中的普通成员变量和代码块,再调用子类的构造方法。