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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhouxp3323 黑马帝   /  2012-3-31 23:01  /  2228 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class StaticCode{
        static{
                System.out.println("A");
        }
        {
                System.out.println("D");
        }
}

public class StaticCodeDemo {

        static{System.out.println("B");}
       
        public static void main(String[] args) {
                new StaticCode();
                new StaticCode();
                System.out.println("Over");
        }
        static{System.out.println("C");}
}

这是一个完整的程序,执行结果是:B C A D D over  ,为什么是这个结果,谁能帮忙分析下啊?为什么不是 B A D D over C 呢?

2 个回复

倒序浏览
class StaticCode{
        static{
                System.out.println("A");
        }
        {
                System.out.println("D");
        }
}

public class StaticCodeDemo {

        static{System.out.println("B");}
        
        public static void main(String[] args) {
                new StaticCode();             静态最先加载原理  这个两个对象在该类两个静态运行之后,显然是 b c  然后再加载staticode类中的静态代码
                new StaticCode();            又因为static只加载一次  所以输出 a   而staticode得代码块 是有几个对象就执行几次  所以dd  最后over
                System.out.println("Over");
        }
        static{System.out.println("C");}
}
回复 使用道具 举报
楼主,先来看一下static和静态代码块的知识再分析:

一、用法:是一个修饰符,用于修饰成员(成员变量 成员函数)被动态所共享

      当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用。 类名.静态成员

二、static特点:

1,随着类的加载而加载
2,优先于对象存在

     明确一点:静态是先存在的,对象后存在
3,被所有对象所共享
4,可以直接被了类名调

三、静态使用注意事项:

1,静态方法只能访问静态成员
      非静态方法既可以访问静态成员,也可以访问非静态

2,静态方法中不可以定义this,super关键字
      因为静态优先于对象存在。所以静态方法中不可以出现this,super

3,主函数是静态的

四、静态有利有弊

        利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象都存储一份
         可以直接被类名调用。

        弊:生命周期过长。访问出现局限性
五、静态代码块  
1. 格式:   static   
                    {                   静态代码块中的执行语句。    }
2.特点:随着类的加载而执行,只执行一次,并优先于主函数    用于给类进行初始化


好了,现在来分析一下这道题:

    程序要进入main方法 首先要加载StaticCodeDemo 这个类

   从而要执行定义在这个类的静态代码段,static{System.out.println("B");
      static{System.out.println("C");}   两个
     输出 B C

    接下来进入主函数,
   当程序运行到 第一次出现 StaticCode();时 就会加载StaticCode这个类从而执行这个类的静态代码段
由于静态代码段只在类第一次加载时才执行 也就是第一个new StaticCode(); 时才执行
后面不论你出现了多少个StaticCode都不会再次执行
而且静态代码段
不依赖于类的实例化 只要你的程序执行过程中第一次碰到了StaticCode就会马上执行静态代码

而System.out.println("D");
每new一次,就会产生一个对象就会执行一次,所以输出两个D

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