别用编译器,用脑子想想,下面代码打印出来的顺序应该是什么样的?public class Test2 extends Test1
{
{
System.out.print("1");
}
Test2()
{
System.out.print("2");
}
static
{
System.out.print("3");
}
{
System.out.print("4");
}
public static void main(String[] args)
{
new Test2();
}
}
{
{
System.out.print("1");
}
Test2()
{
System.out.print("2");
}
static
{
System.out.print("3");
}
{
System.out.print("4");
}
public static void main(String[] args)
{
new Test2();
}
}
{
Test1()
{
System.out.print("5");
}
static
{
System.out.print("6");
}
}
静态优先,构造器最后
System.out.print("4");
}
这个编译不过去吧?
父类静态->子类静态->父类构造->子类构造, 应该不是很难
{
{
System.out.print("1");
} //我想知道LZ这个可以编译过去吗,就红色的这算是什么啊?
//如果可以编译过去的话,这是一个什么样的问题那
Test2()
{
System.out.print("2");
}
static
{
System.out.print("3");
}
{
System.out.print("4");
}
public static void main(String[] args)
{
new Test2();
}
}
class Parent {
// 静态变量
public static String p_StaticField = "父类--静态变量";
// 变量
public String p_Field = "父类--变量";
// 静态初始化块
static {
System.out.println(p_StaticField);
System.out.println("父类--静态初始化块");
}
// 初始化块
{
System.out.println(p_Field);
System.out.println("父类--初始化块");
}
// 构造器
public Parent() {
System.out.println("父类--构造器");
}
}
public class SubClass extends Parent {
// 静态变量
public static String s_StaticField = "子类--静态变量";
// 变量
public String s_Field = "子类--变量";
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类--静态初始化块");
}
// 初始化块
{
System.out.println(s_Field);
System.out.println("子类--初始化块");
}
// 构造器
public SubClass() {
System.out.println("子类--构造器");
}
// 程序入口
public static void main(String[] args) {
new SubClass();
}
}
运行一下上面的代码,结果马上呈现在我们的眼前: 父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
类加载完毕,才会开始准备生成继承体系的对象,从顶层类开始Object,非static变量,非static代码块,构造器的调用,一个父类的对象出来了,处于可用状态,马上开始下一级的对象的生成工作,一直到没有子类的那个类的对象生成出来.
对象生成工作OVER!
你怎么不问别人system.out.println(“a”);
和import了system包以后
out.println(“a”);哪个执行更快呢?
2、游离块(先父类,后子类)
3、构造函数(先父类,后子类)
635142
父类静态->子类静态->父类构造->子类构造, 应该不是很难
1,先父类,后子类
2,先静态,后实例,最后构造函数