1

jdk1.6与jdk1.8程序运行时类加载的区别

jdk1.6以前版本程序运行时,会先把要用到的类加载成字节码,然后寻找这些类的静态块和被赋值的静态变量,然后main方法入栈。而在jdk1.8中,则是运行时加载到那个类,在加载到的那个类寻找这个类的静态块和静态变量,如果这个类没有静态块,那么main方法将会优先后来运行时加载的类的静态块。
上代码:
我们首先定义一个类Person

@java
    public class Person{
    
      static{  
          System.out.println("静态块开始执行");
          System.out.println("静态块结束执行")
      }
      
      public Person(){
        System.out.println("构造方法开始执行")
        System.out.println("构造方法结束执行")
      }
      
    }

在定义一个类PersonTest

@java
        public class PersonTest{
         public static void main(String[] ages ){
              Person person = new Person();
        }  
     }   

运行结果显而易见,假如在jdk1.6的版本中,会先执行Person类的静态块,然后main方法入栈,再执行方法,在堆中开辟一块内存空间,内存地址指向栈中的main方法里面的引用person。然后main方法正常完成退出(正常完成退出是因为还有异常完成退出)。
但是在jdk1.8版本以后类加载时会优先执行main方法,然后运行到Person类中的静态块,执行静态块,然后执行构造方法,main方法正常完成退出。
jdk1.8静态块和main方法在一个类中
上代码:

@java 
        public class Person{
        
        public static void main(String[] ages ){
              Person person = new Person();
        }  
    
      static{  
          System.out.println("静态块开始执行");
          System.out.println("静态块结束执行")
      }
      
      public Person(){
        System.out.println("构造方法开始执行")
        System.out.println("构造方法结束执行")
      }
      
    }

这时候main方法和静态块的优先级,静态块>main方法


Autonomy
15 声望2 粉丝

« 上一篇
JAVA抽象类
下一篇 »
多线程基础