A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Test2
{
        static String a = "string - a";
        static String b;
       
        String c = "string -c";
        String d;
       
        static
        {
                printStatic("before static");
                b = "string -b";
                printStatic ("after static");
        }
       
        public static void printStatic(String title)
        {
                System.out.println("-------"+title+"-------");
                System.out.println("a ="+a);
                System.out.println("b ="+b);
        }
        public Test2()
        {
                print("before constructor");
                d = "string -d";
                print ("after constructor");
               
        }
        public void print(String title)
        {
               
                System.out.println("------------"+title+"------------");
                System.out.println("a="+a);
                System.out.println("b="+b);
                System.out.println("c="+c);
                System.out.println("d="+d);

        }
        public static void main(String args[])
        {
                new Test2();
        }
}


代码如上,看的非常混乱 完全没头绪,书上说这个看懂了,类的运行顺序基本也就搞定了{:soso_e109:}


评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

3 个回复

倒序浏览
public class Test2 {

        static String a = "string - a";//(1)
        static String b;//(2)
        String c = "string -c";
        String d;
        static {//(3)
                printStatic("before static");
                //(5)
                b = "string -b";
                printStatic("after static");
        }

        public static void printStatic(String title) {//(4),(6)
                System.out.println("-------" + title + "-------");
                System.out.println("a =" + a);
                System.out.println("b =" + b);
        }

        public Test2() {//(7)
                print("before constructor");
                //(9)
                d = "string -d";
                print("after constructor");

        }

        public void print(String title) {//(8),(10)

                System.out.println("------------" + title + "------------");
                System.out.println("a=" + a);
                System.out.println("b=" + b);
                System.out.println("c=" + c);
                System.out.println("d=" + d);

        }
        public static void main(String args[]) {
                //在这里第一次使用该类创建对象,所以首先开始执行该类的类成员
                new Test2();
        }

}

静态函数和静态变量:静态函数和静态变量是属于类的本事,在同一个JVM内,每一个类只对应一个Class对象。
因此一个类的类变量只需要一块内存空间。当虚拟机第一次加载类时,会为该类的静态变量分配的空间,用于存类成员的数据。
而且只会执行一次。类成员不能访问实例成员,但实例成员可以访问类成员。所以可以通过类.类成员和对象.类成员。
非静态函数和非静态变量:他们属于对象,不属于类,所以在创建对象的时候,才会为他们分配内存空间,而且每创建一个对象,都会为其分配相应的空间。
根据上面的描述,执行顺序就非常清楚了,  为了你更好的理解我在代码中表了()表示执行的顺序

希望对你有所帮助

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 朱玺 于 2013-3-10 14:06 编辑

对象的初始化顺序:
       首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

注意:
        子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

public class Test2
{
        static String a = "string - a";                               //2,静态变量a=string-a加载
        static String b;                                                       //3,静态变量b=null加载

        String c = "string -c";
        String d;

        static
        {
                printStatic("before static");           //4,静态代码块:优先执行,调用printStatic();
                b = "string -b";                                    //8,执行b
                printStatic ("after static");                    //9,调用printStatic();
        }

        public static void printStatic(String title)
        {
                System.out.println("-------"+title+"-------");        //5,输出---before static-----       //10,输出-----after static-----
                System.out.println("a ="+a);                               //6,输出a =string - a               //11,输出a =string - a        
                System.out.println("b ="+b);                                //7,输出b =null                                //12,b =string -b
        }
        public Test2()                                                                //执行构造函数··下面与上面类似调用
        {
                print("before constructor");
                d = "string -d";
                print ("after constructor");

        }
        public void print(String title)
        {

                System.out.println("------------"+title+"------------");
                System.out.println("a="+a);
                System.out.println("b="+b);
                System.out.println("c="+c);
                System.out.println("d="+d);

        }
        public static void main(String args[])
        {
                new Test2();                        // 1, 先执行
        }
}

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马