zoukankan      html  css  js  c++  java
  • Java中类及方法的加载顺序

    1. 虚拟机在首次加载Java类时,会对静态代码块、静态成员变量、静态方法进行一次初始化(静态间按顺序执行)。

    2. 只有在调用new方法时才会创建类的实例。

    3. 类实例创建过程:父子继承关系,先父类再子类。父类的静态->子类的静态->父类的初始化块->父类的构造方法->子类的初始化块->子类的构造方法

    4. 类实例销毁时候:首先销毁子类部分,再销毁父类部分。

    package exercise;  
      
    public class Main_exer {  
        void myMethod(Object o){  
            System.out.println("object");  
        }  
        void myMethod(String s){  
            System.out.println("string");  
        }  
        public static void main(String[] args) {  
            Main_exer ma = new Main_exer();  
            ma.myMethod(null);  
        }  

    输出结果:

    string

    例:

    package classLoader_demo;
    
    public class Parent
    {
        //静态成员变量
        public static int t = parentStaticMethod2();
        //代码块
        {
            System.out.println("父类非静态初始化块");
        }
        static
        {
            System.out.println("父类静态初始化块");
        }
        //构造方法
        public Parent()
        {
            System.out.println("父类的构造方法");
        }
        //父类静态方法
        public static int parentStaticMethod()
        {
            System.out.println("父类的静态方法");
            return 10;
        }
        public static int parentStaticMethod2()
        {
            System.out.println("父类的静态方法2");
            return 9;
        }
      
        @Override
        protected void finalize() throws Throwable
        {
            // TODO Auto-generated method stub
            super.finalize();
            System.out.println("销毁父类");
        }
     
    }
    package classLoader_demo;
    
    public class Parent
    {
        //静态成员变量
        public static int t = parentStaticMethod2();
        //代码块
        {
            System.out.println("父类非静态初始化块");
        }
        static
        {
            System.out.println("父类静态初始化块");
        }
        //构造方法
        public Parent()
        {
            System.out.println("父类的构造方法");
        }
        //父类静态方法
        public static int parentStaticMethod()
        {
            System.out.println("父类的静态方法");
            return 10;
        }
        public static int parentStaticMethod2()
        {
            System.out.println("父类的静态方法2");
            return 9;
        }
      
        @Override
        protected void finalize() throws Throwable
        {
            // TODO Auto-generated method stub
            super.finalize();
            System.out.println("销毁父类");
        }
     
    }

    当main中语句为

    Parent.parentStaticMethod(); 

    输出结果:

    父类的静态方法2
    父类静态初始化块
    父类的静态方法

    注:参照文章开头第一条,且注意仅首次加载JAVA类会执行

    当main中语句为

    Child child = new Child();
            try {
                child.finalize();
            } catch (Throwable e) {
                e.printStackTrace();
            }

    输出结果:

    父类的静态方法2
    父类静态初始化块
    子类静态初始化块
    父类非静态初始化块
    父类的构造方法
    子类非静态初始化块
    子类的构造方法
    销毁父类
    销毁子类
    此处输出结果中的先输出“销毁父类”,再输出“销毁子类”,与前面提到的先销毁子类再销毁父类并不矛盾。仍然为先调用子类的销毁方法,再调用父类的销毁方法,只是super关键字的原因。

  • 相关阅读:
    tomcat设置编码utf8
    servlet详细理解
    设置utf8编码问题
    yarn状态机的可视化
    以卵石游戏(杭州电1527)
    Android Studio虚拟机配置虚拟键盘
    linux网络编程--跳水send和recv
    基于redis AE异步网络架构
    谈加班文化
    ios8加入通知栏开始
  • 原文地址:https://www.cnblogs.com/zhimingxin/p/7736747.html
Copyright © 2011-2022 走看看