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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Test
  2. {
  3.               static int i=1;
  4.               static{
  5.                                  System.out.println(i+"看看,到底是谁在前面呢");
  6.                                    show2();

  7.                }
  8.                    //static int i=1;
  9.           public static void main(String[] args){
  10.                                    Test t=new Test();
  11.                                      t.show();
  12.                       }
  13.                      public void show(){
  14.                                      System.out.println("测试专用!!!!静态方法调用非静态方法");
  15.                       }
  16.                       public static void show2(){
  17.                                         System.out.println("静态代码块调用静态方法!!没想到在后面也是可以的");
  18.                         }
  19. }
复制代码

很是迷惑,到底是谁先执行呢???于是写了一段代码:
可以得到几个结论:
1)静态代码块中调用静态变量,当静态属性在其后边时,执行错误,可以看出,是这两者是按照顺序执行的
2)静态属性要在之前定义,才能在静态代码中调用
3)但是静态方法就没事了,调用时才被执行.无顺序要求。
4)并且静态方法可以通过对象调用非静态方法,但是不可以直接调用

5 个回复

倒序浏览
写得很好,谢谢分享!!
回复 使用道具 举报
还是很困惑啊
回复 使用道具 举报
大牛,学习了
回复 使用道具 举报
main方法,建立Test对象,然后Test类加载进内存,静态成员先进入方法区中的静态区,然后静态代码块执行(给类进行初始化),打印:1+"看看,到底是谁在前面呢"
调用show2(),因为也是静态的,所以也在静态区中,打印:静态代码块调用静态方法!!没想到在后面也是可以的
建立Test对象,t调用show(),打印:测试专用!!!!静态方法调用非静态方法
回复 使用道具 举报
duzhi409 发表于 2015-6-12 00:46
main方法,建立Test对象,然后Test类加载进内存,静态成员先进入方法区中的静态区,然后静态代码块执行(给 ...

嗯 说的不错就是如此,但是若是静态成员变量在后边,就不行了,会顺序执行代码块的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马