注册 登录
编程论坛 JAVA论坛

求一个关于类的加载和static变量及方法和构造器运行先后问题

LSASTA 发布于 2015-09-18 21:02, 870 次点击
public class Demo2 {
    public static int k=0;
    public static Demo2 t1=new Demo2("t1");
    public static Demo2 t2=new Demo2("t2");
    public static int i=print("i");
    public static int j=print("j");
    public static int n=99;
    //代码块
    {
        print("构造函数");
    }
    //静态代码块
    static{
        print("静态代码块");   
    }
    //静态方法
    public static int print(String s){
        System.out.println(" i= " + i + " " + s + "  k= " + k + " n= " + n + " j            = " + j);
        ++i;
        ++k;
        ++n;
        return i;
    }
    //构造器
    public Demo2(String string){
        print(string);
    }   
    //主函数
    public static void main(String[] args){
        Demo2 d=new Demo2 d=new Demo2("T");
    }
}
12 回复
#2
LSASTA2015-09-18 21:09
求一位耐心的大神能给我详细的讲解一下运行步骤
#3
林月儿2015-09-18 21:10
以下是引用LSASTA在2015-9-18 21:02:38的发言:

public class Demo2 {
    public static int k=0;
    public static Demo2 t1=new Demo2("t1");
    public static Demo2 t2=new Demo2("t2");
    public static int i=print("i");
    public static int j=print("j");
    public static int n=99;
    //代码块
    {
        print("构造函数");            //这为啥打印构造函数?不是代码块么?
    }
    //静态代码块
    static{
        print("静态代码块");   
    }
    //静态方法
    public static int print(String s){
        System.out.println(" i= " + i + " " + s + "  k= " + k + " n= " + n + " j            = " + j);
        ++i;
        ++k;
        ++n;
        return i;
    }
    //构造器
    public Demo2(String string){
        print(string);
    }   
    //主函数
    public static void main(String[] args){
        Demo2 d=new Demo2 d=new Demo2("T");
    }
}

静态代码块-》代码块-》构造器
#4
诸葛欧阳2015-09-18 22:31
静态代码块最先执行且只执行一次
#5
LSASTA2015-09-18 23:27
回复 4楼 诸葛欧阳
但是输出来却是这个样子:我始终看不懂
 i= 0 构造代码块  k= 0 n= 0 j = 0
 i= 1 t1  k= 1 n= 1 j = 0
 i= 2 构造代码块  k= 2 n= 2 j = 0
 i= 3 t2  k= 3 n= 3 j = 0
 i= 4 i  k= 4 n= 4 j = 0
 i= 5 j  k= 5 n= 5 j = 0
 i= 6 静态代码块  k= 6 n= 99 j = 6
 i= 7 构造代码块  k= 7 n= 100 j = 6
 i= 8 T  k= 8 n= 101 j = 6
#6
LSASTA2015-09-18 23:28
回复 3楼 林月儿
但是答案好像不是这样子的
 i= 0 构造代码块  k= 0 n= 0 j            = 0
 i= 1 t1  k= 1 n= 1 j            = 0
 i= 2 构造代码块  k= 2 n= 2 j            = 0
 i= 3 t2  k= 3 n= 3 j            = 0
 i= 4 i  k= 4 n= 4 j            = 0
 i= 5 j  k= 5 n= 5 j            = 0
 i= 6 静态代码块  k= 6 n= 99 j            = 6
 i= 7 构造代码块  k= 7 n= 100 j            = 6
 i= 8 T  k= 8 n= 101 j            = 6
#7
诸葛欧阳2015-09-19 01:49
你的主方法是怎么回事?
#8
诸葛欧阳2015-09-19 10:01
单步执行发现它先执行d1,d2的构造
#9
LSASTA2015-09-19 22:53
回复 7楼 诸葛欧阳
不好意思主方法那儿写错了哦;;
#10
LSASTA2015-09-19 22:55
回复 8楼 诸葛欧阳
我也不知道他是怎么执行的,,,走两步就走不通了,,,主要是和答案对不上
#11
calix2015-09-20 20:47
静态代码块 > 构造方法 > 实例代码块(有对象产生才会执行)
静态方法和属性由外层只执行一遍,上面的代码中d.t1 == d.t1.t1 == d.t1.t1.t1 == ...

public static Demo2 t1=new Demo2("t1") 这种写法不太建议,赋值放在构造方法里面比较好
比如非静态的情况
public Demo2 t1=new Demo2("t1")这样声明加初始化的方式,会多次执行且会造成内存溢出
#12
神vLinux飘飘2015-10-07 00:07
楼主的代码风格奇异,在下实在看不明白啊,不过大概能猜出楼主为啥纠结,这里有一个细节:static的声明顺序

为了简单说明问题,我这里自己写了一个类
程序代码:

public class Foo {

    public static Foo f1 = new Foo();

    {
        System.out.println("<init>");
    }

    static {
        System.out.println("<clinit>");
    }

    public static void main(String...args) {
        Foo.f1.toString();
    }

}

输出结果为
<init>
<clinit>


恩,竟然是<init>在前<clinit>在后,为啥?因为你声明的f1排在static{}之前。

实际上编译出来的代码大概是这样的

程序代码:

public class Foo {
   
    public static Foo f1 = null;
   
    static <clinit>() {
        f1 = new Foo();
        System.out.println("<clinit>");
    }

    public <init>() {
        super.<init>();
        System.out.println("<init>");
    }
}



结论:对于static块而言,顺序很重要,整个Class执行的顺序如calix而言

静态代码块 > 构造方法 > 实例代码块(有对象产生才会执行)
#13
林月儿2015-10-07 10:06
程序代码:
public class Test2 {
    public Test2()
    {
        System.out.println("==============构造方法======");
    }
    {
        System.out.println("==============实例块=======");
    }
    static
    {
        System.out.println("==============静态块=======");
    }
    public static void main(String[] agrs) {
        new Test2();
    }
   
}

运行结果:
==============静态块=======
==============实例块=======
==============构造方法======
1