写出执行A中的main方法后的执行结果
public class A{
{
System.out.println(“1”);
}
static {
System.out.println(“2”);
}
public A(){
System.out.println(“new A”);
}
public void print(){
System.out.println(“print in A”);
}
public static void main(String[] args){
A a = new B();
a..print();
}
}
class B extends A{
{
System.out.println(“3”);
}
static{
System.out.println(“4”);
}
public B(){
System.out.println(“new B”);
}
public void print(){
super.print();
System.out.println(“print in B”);
}
}
public class A{
{
System.out.println(“1”);
}
static {
System.out.println(“2”);
}
public A(){
System.out.println(“new A”);
}
public void print(){
System.out.println(“print in A”);
}
public static void main(String[] args){
A a = new B();
a..print();
}
}
class B extends A{
{
System.out.println(“3”);
}
static{
System.out.println(“4”);
}
public B(){
System.out.println(“new B”);
}
public void print(){
super.print();
System.out.println(“print in B”);
}
}
4
print in B
我猜应该:用子类的实列来赋給父类,应该应该执行父类的静态块static,在执行子类的静态块
再执行父类的构造方法,在执行子类的构造方法
但运行后是:
2
4
1
new A
3
new B
print in A
print in B才看出来:静态块是最先执行没错,而 {}体 执行在构造方法之前
学习了
这样父类的变量引用子类的实例的具体过程是什么样的?
就是具体执行规则
4
1
new A
3
new B
print in A
print in B
4//最先执行static代码块,构造方法之前
1//这个1为什么比new A 先执行?类都没有构造出来,怎么就执行了?new A
3
new B
print in A
print in B其他的好理解
4
1
New A
3
New B
print in A
print in B
其实也就是在类被加载后,初始化的顺序问题
1:父类的静态成员,静态块
2:子类的静态成员,静态块
3:父类的非静态成员,非静态块,构造函数
4:子类的非静态成员,非静态块,构造函数