[b]一、除了Object外没有继承其他类的类[/b]
执行结果:
当然初始化的顺序不言而喻额:类加载、校验、准备后便初始化静态变量及执行静态块;对象先执行成员的初始化,然后在执行自身的构造函数。如果类没有被加载,直接调用new创建对象,则先加载类,并做相关初始化,然后再创建对象,如下所示:
执行结果:
[b]二、除了Object还继承了其他类的类[/b]
一个原则——先父后子,两个过程——先加载后创建对象。详细过程如下:
先加载、初始化父类,然后加载、初始化子类;先创建父类对象,然后创建子类对象。
所以,上述代码的执行结果为:
class Base {
protected static int a = 3;
protected int b = 5;
static{
System.out.println("a = " + a);
}
{
System.out.println("b = " + b);
}
public Base(){
System.out.println("In constructor...");
}
}
class Initailization {
public static void main(String[] args) {
System.out.println("Before use...");
System.out.println("Base.a = " + Base.a);
System.out.println("After use...");
System.out.println("Before new...");
new Base();
System.out.println("After new...");
}
}
执行结果:
Before use...
a = 3
Base.a = 3
After use...
Before new...
b = 5
In constructor...
After new...
当然初始化的顺序不言而喻额:类加载、校验、准备后便初始化静态变量及执行静态块;对象先执行成员的初始化,然后在执行自身的构造函数。如果类没有被加载,直接调用new创建对象,则先加载类,并做相关初始化,然后再创建对象,如下所示:
class Base {
protected static int a = 3;
{
System.out.println("a1 = " + a);
}
protected int b = 5;
static{
System.out.println("a = " + a);
}
{
System.out.println("b2 = " + b);
}
public Base(){
System.out.println("In constructor...");
}
}
class Initailization {
public static void main(String[] args) {
System.out.println("Before new...");
new Base();
System.out.println("After new...");
}
}
执行结果:
Before new...
a = 3
a1 = 3
b2 = 5
In constructor...
After new...
[b]二、除了Object还继承了其他类的类[/b]
一个原则——先父后子,两个过程——先加载后创建对象。详细过程如下:
先加载、初始化父类,然后加载、初始化子类;先创建父类对象,然后创建子类对象。
class A {
static {
System.out.print(1);
}
public A() {
System.out.print(2);
}
}
class B extends A {
static {
System.out.print(3);
}
{
}
public B() {
System.out.print(4);
}
public static void main(String[] args) {
B b1 = new B();
System.out.print(",");
new B();
}
}
所以,上述代码的执行结果为:
1324,24