关于java:jdk16与jdk18程序运行时类加载的区别

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办法

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理