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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐君 中级黑马   /  2013-11-18 18:25  /  1845 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class StaticCode{
        static{
                System.out.println("A");
        }
        public void show(){
                System.out.println("show run");
        }
}
public class StaticCodeDemo {
        static{
                System.out.println("B");
        }
        public static void main(String[] args) {
                new StaticCode().show();
        }
        static{
                System.out.println("C");
        }

}
接果为嘛会是B C A。。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
public class StaticCodeDemo {
        static{
                System.out.println("B");
        }
        public static void main(String[] args) {
                new StaticCode().show();
        }
        static{
                System.out.println("C");
        }

}
java虚拟机运行时先加载StaticCodeDemo 类。
静态代码块随了类的加载而加载,用于对类进行初始化,
StaticCodeDemo 类中的两个静态代码块先后执行打印出BC
接着主函数执行 ,建立StaticCode对象,同样先执行StaticCode类中的静态代码块打印出A
接着show方法运行

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
static{
                System.out.println("B");
        }
static{
                System.out.println("C");
        }
static{
                System.out.println("A");
        }
这个叫静态代码块,是随着类的加载就加载,简单说就是优先主函数main执行。
当你new StaticCode().show(); 时,静态代码块就加载了,按顺序B C A 执行完之后才执行show(); 也就是 show run

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

回复 使用道具 举报
1、程序开始时,首先去加载带有main函数的类,即首先加载主类StaticCodeDemo,主类中有两个static函数体,它们随着主类的加载而加载,所以首先输出B、C
2.执行完两个static函数,开始执行main函数,main函数里调用了StaticCode类中的show方法,首先要建立StaticCode类的对象,同样的,StaticCode类中有一个static函数体,随着对象的建立,这个函数体随着类的加载而加载,所以输出A
3、StaticCode类执行完一个static函数,开始执行show函数,输出show run。

就记住一点,static随着类的加载而加载,不用生成对象即可使用。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 山寨

查看全部评分

回复 使用道具 举报
静态代码块 随着类的加载而同时加载   已加载 static{  System.out.println("B");    }  和static{
   System.out.println("C"); 就优先运行  故输出 B  C      虽然两句位置不在一起  但是StaticCodeDemo  已加载  她们都是优先加载的   然后再运行 new StaticCode().show();   这个new StaticCode() 已创建 匿名对象 就开始调用
class StaticCode   但是static{  System.out.println("A");    优先运行 故输出A   

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
1.jvm在执行你这段代码时,首先找到主程序入口所在类,即public static void main()所在类,StaticCodeDemo,先把它加载到内存中,同时发现有静态代码块,就安代码先后顺序,随类的加载而加载并执行,所以会先打印B,后打印C.
2.主程序中,对类StaticCode初始化,并将其加载到内存中,首先先查看是否有静态代码块,有就先执行,那么就打印出C,最后调用了该对象的Show()方法。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
zdrain 中级黑马 2013-11-18 19:23:10
7#
首先,static静态代码块用于类的初始化,类加载,它就运行,所以当javac的时候,主函数所在类的静态代码块就执行了,b c就打印了。

然后执行main函数里的内容。

new StaticCode的时候这个类加载进内存,所以这个类的静态代码块执行,打印A.

然后调用show方法,打印show run。

总之,执行顺序,静态代码块,显示初始化,构造代码块,构造函数,具体内容。这个好像得背下来

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 山寨

查看全部评分

回复 使用道具 举报
徐君 中级黑马 2013-11-18 21:14:06
8#
哦哦,晓得了。。谢谢各位哈
回复 使用道具 举报
默狼 中级黑马 2013-11-18 21:25:59
9#
程序编译时会先加载主函数。而在运行的时候会先运行静态代码块的代码,然后是加载方法代码,调用方法里的show方法执行结果、
回复 使用道具 举报
FFF 金牌黑马 2013-11-19 00:17:15
10#
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马