黑马程序员技术交流社区

标题: 关于静态的一点疑问 [打印本页]

作者: 为你而去    时间: 2014-2-28 09:02
标题: 关于静态的一点疑问

class StaticCode
{
        static
        {
                System.out.println("c");
        }
        {
                System.out.println("d");
        }
        public static void show()
        {
                System.out.println("show run");
        }
}

class  StaticCodeDemo
{
        static
        {
                System.out.println("a");
        }
        public static void main(String[] args)
        {
                new StaticCode();   //不同点
                System.out.println("Hello World!");
        }
        static
        {
                System.out.println("b");
        }
}
运行结果:
a
b
c
d
Hellow  World

class StaticCode
{
        static
        {
                System.out.println("c");
        }
        {
                System.out.println("d");
        }
        public static void show()
        {
                System.out.println("show run");
        }
}

class  StaticCodeDemo
{
        static
        {
                System.out.println("a");
        }
        public static void main(String[] args)
        {
                StaticCode.show();//不同点
                System.out.println("Hello World!");
        }
        static
        {
                System.out.println("b");
        }
}
运行结果
a
b
c
show run
Hellow  World

下边的为什么执行不到“d”??不是说Static代码块会随着类的存在而执行吗

作者: 赵卓辉    时间: 2014-2-28 09:37
你代码里打印d的代码块是普通代码块,在创建对象的时候才会执行。你在main函数里并没有创建对象,而是直接用的类名。静态方法调用的show函数,所以不会打印d。你把打印d的代码块声明为静态代码块就会打印d了。
作者: xiaochen33520    时间: 2014-2-28 10:04
  代码块的执行顺序: 静态代码块 构造代码块  构造函数。被静态修饰的成员变量和成员函数在类加载的时候就已经在存入静态方法区,所以可以直接被类名调用,而未被静态修饰的成员变量和成员方法必须通过建立对象的方式完成初始化,才能被引用类型变量调用。
作者: 黄飞1991    时间: 2014-2-28 11:13
     第一个程序运行结果中有d, 是因为创建了对象new StaticCode(), 执行d的语句属于构造代码块,会随着对象的创建而执行。
     第二个程序运行结果中没有d,执行d的语句属于构造代码块,主函数仅仅执行了StaticCode.show();语句,属于静态调用,没有创建对象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2