开发者社区 问答 正文

java中static相关问题

class Bowl {
static{ 
System.out.println("这是Bow3的测试!");
}
{
System.out.println("这是Bow1的测试!");
}
static{
System.out.println("这是Bow4的测试!");
}
}

以上类new后输出:
这是Bow3的测试!
这是Bow4的测试!
这是Bow1的测试!
应该是在类编译的时候就已经加载了,那么static{}和{}区别是什么?

展开
收起
蛮大人123 2016-06-07 15:19:33 2036 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    普通初始化块负责对象初始化,类初始化负责对类进行初始化。静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建
    对象时才执行。而你说在编译时就加载了静态初始化块我认为就不太正确了,准确说是:当JVM第一次主动使用某个类时,系统会在类准备阶段为该类的所有
    的静态成员变量分配内存;在初始化阶段则初始化这些静态常量。那么你new之前不就是在使用这个Bowl类,那么JVM不就应该加载该类的所有类变量,
    在new之前定义一个Bowl对象时这个阶段就应该初始化该类的所有成员变量,最后调用该类的构造方法。

    //普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”

    public class CodeBlock01{
          public static void main(String[] args){
              
                {
                  int x=3;
                  System.out.println("1,普通代码块内的变量x="+x);    
                }
                
                int x=1;
                System.out.println("主方法内的变量x="+x);
                
                {
                   int y=7;
                   System.out.println("2,普通代码块内的变量y="+y);    
                }
              }
        }
        
        /*
        运行结果:
        1,普通代码块内的变量x=3
             主方法内的变量x=1
             2,普通代码块内的变量y=7
        */
    //构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
    
    public class CodeBlock02{
        {
          System.out.println("第一代码块");    
        }
        
        public CodeBlock02(){
            System.out.println("构造方法");
            }
            
            {
              System.out.println("第二构造块");
            }
          public static void main(String[] args){
              new CodeBlock02();
              new CodeBlock02();
              new CodeBlock02();
               
        }
    }    
    
    /*
    *
    执行结果:
    第一代码块
    第二构造块
    构造方法
    第一代码块
    第二构造块
    构造方法
    第一代码块
    第二构造块
    构造方法
    */
    //如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
    //注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
    
    
    class Code{
        {
          System.out.println("Code的构造块");
        }
        
        static{
            System.out.println("Code的静态代码块");
            }
            
        public Code(){
            System.out.println("Code的构造方法");
            }
        }
        
        
    public class CodeBlock03{
         {
          System.out.println("CodeBlock03的构造块");    
         }
         
         static{
            System.out.println("CodeBlock03的静态代码块");
            }
            
            public CodeBlock03(){
                 System.out.println("CodeBlock03的构造方法");
                }
            
          public static void main(String[] args){
                System.out.println("CodeBlock03的主方法");
                new Code();
                new Code();
                new CodeBlock03();
                new CodeBlock03();
              }
        }
    /*
    CodeBlock03的静态代码块
    CodeBlock03的主方法
    Code的静态代码块
    Code的构造块
    Code的构造方法
    Code的构造块
    Code的构造方法
    CodeBlock03的构造块
    CodeBlock03的构造方法
    CodeBlock03的构造块
    CodeBlock03的构造方法
    */
    2019-07-17 19:30:17
    赞同 展开评论
问答分类:
问答标签:
问答地址: