zoukankan      html  css  js  c++  java
  • Java 对象生命周期

    1.Java类的初始化

    • 只有在 Java类被第一次使用时,虚拟机才会对该Java类进行初始化。
    • 初始化过程中静态代码块和静态域会按照书写顺序依次执行。
    • 当访问Java类或接口中的静态域时,只有真正声明这个域的类或接口会被初始化。如:在类A中声明了静态域value,类B继承自类A。通过B.value可以直接访问类A中声明的静态域value。虽然引用时使用的类B,但是由于value是在类A中声明的,因此B.value只会初始化类A,类B不会被初始化。
    /**
     * @author lzzz
     *
     */
    public class J17101901 {
        public static void main(String[] args) {
            System.out.println(B.value);
            /*
             out:
             A static
             1
             */
        }
    }
    
    class A {
        static int value = 1;
        static {
            System.out.println("A static");
        }
    }
    
    class B extends A {
        static {
            System.out.println("B static");
        }
    }
    • 下面可能造成类被初始化的操作
    1. 创建对象
    2. 调用类中的静态方法
    3. 为类或接口中的静态域赋值
    4. 访问类或接口中声明的静态域
    5. 调用Class类和反射API

    2.Java对象的创建于初始化

    • 在实际创建对象之前分配内存空间。所需的内存空间大小取决于Java类及其父类和祖先类包含的所有实例域的数量和类型。
    • 内存分配成功之后将所有实例域设为默认值。
    • 调用构造方法,类的构造方法调用过程分成三步:第一步是调用父类的构造方法,没有显示定义将会调用默认构造方法。第二步是按照书写顺序初始化类中的实例域。第三步是执行类的构造方法中的相应代码。
    /**
     * @author lzzz
     *
     */
    public class J17100805 {
        static {
            System.out.println("father static{}");
        }
        {
            System.out.println("father {}");
        }
        private int id = print("father private int id");
        private static int staticId = print("father private static int"); 
        public static int print(String str) {
            System.out.println(str);
            return 1;
        }
    
        public static void main(String[] args) {
            J17100805 j1 = new J17100805(); 
            System.out.println("--------我在j1之后--------");
            J17100805 j2 = new J17100805();
            System.out.println("--------我在j2之后--------");
            J17100805 j3 = new J17100805();
            System.out.println("
    --------我是分割线--------
    ");
            System.out.println("--------我在jj1之后--------");
            J171008051 jj2 = new J171008051();
            System.out.println("--------我在jj2之后--------");
            J171008051 jj3 = new J171008051();
            /*
             father static{}
             father private static int
             father {}
             father private int id
             --------我在j1之后--------
             father {}
             father private int id
             --------我在j2之后--------
             father {}
             father private int id
            
             --------我是分割线--------
            
             --------我在jj1之后--------
             child static{}
             child private static int
             father {}
             father private int id
             child {}
             child private int id
             --------我在jj2之后--------
             father {}
             father private int id
             child {}
             child private int id
             */
        }
    }
    • 不要在构造方法中调用可以被子类覆盖的方法。

    3.对象终止

    • Java采用自动内存管理机制,对象回收工作由垃圾回收器自动完成。
    • 如果一定要手动处理相关工作,Java提供了finalize方法。
  • 相关阅读:
    poj 2479
    纯CSS实现小圆点和三角形图案
    HDOJ1084 What Is Your Grade?
    4星|《一世富贵》:穿越到宋朝去抢了狄青、范仲淹的风头
    世界不是平的,发达国家在本地生产越来越合算。观点宏大,证据薄弱:3星|《后全球化时代》
    饥饿疗法是目前唯一确信能够延缓衰老的办法:4星|《三联生活周刊》2018年3期
    4星|《重塑》:消费者的信息能力是一个重要的经济变量。新颖的、有见地的国人原创经济理论
    3星|《高情商谈判》:谈判中控制情绪非常重要
    中间商赚差价让世界更美好:3.5星|《中间人经济》
    3.5星|《新零售的未来》:中美两国零售业的现状的分析和未来的展望
  • 原文地址:https://www.cnblogs.com/larobyo/p/7638690.html
Copyright © 2011-2022 走看看