zoukankan      html  css  js  c++  java
  • JAVA初始化及类的加载

    在许多传统语言中,程序是作为启动过程的一部分被加载的。然后是初始化,紧接着程序开始运行。这些语言的初始化过程必须小心控制,以确保定义为static的东西,其初始化顺序不会造成麻烦。例如C++期望一个static在另一个static在被初始化之前就能有效的使用它,那么就会出现问题。

    java不会出现这种问题,java采用了一种不同的加载方式。每个类的编译代码只有在初次使用时才加载。这通常是指加载发生在创建类的第一个对象之时但是当访问static域或static方法时,也会发生加载

    初次使用之处也是static初始化发生之处。所有static对象和static代码段都会在加载时依程序中的顺序【定义类的书写顺序】而一次初始化。当然,定义为static的东西只会被初始化一次。

    注意点:

    构造器也是static方法,尽管static关键字并没有显式的写出来。因此更准确的讲类是在其任何static成员被访问时加载的

    public class Insect {
        private int i=9;
        protected int j;
        Insect(){
            System.out.println("i="+i+",j="+j);
            j=39;
        }
        private static  int x1=printInit("static Insect.x1 initialized");
        static int printInit(String s){
            System.out.println(s);
            return 47;
        }
    }
    View Code
    public class Bettle extends  Insect{
        private int k=printInit("Beetle.k init");
        public Bettle(){
            System.out.println("k="+k);
            System.out.println("j="+j);
        }
        private static int x2=printInit("static Beetle.x2 init");
    
        public static void main(String[] args) {
            System.out.println("Bettle constructor");
    //        Bettle bettle=new Bettle();
        }
    }
    View Code
    output:
    static Insect.x1 initialized static Beetle.x2 init Bettle constructor i=9,j=0 Beetle.k init k=47 j=39

      1.基类的static代码段会优先与派生类的static初始化

           2.基类的构造优先发生于派生类的构造器:其实本质也是一个static方法

  • 相关阅读:
    MYSQL学习笔记——sql语句优化工具
    SQL优化工具SQLAdvisor使用
    SqlServer性能检测和优化工具使用详细
    Sql优化器究竟帮你做了哪些工作
    通俗易懂的php多线程解决方案
    PHP删除数组中空值的方法介绍
    PHP函数
    python函数回顾:dir()
    面向对象封装思想小结
    python函数回顾:all()
  • 原文地址:https://www.cnblogs.com/zhangfengshi/p/9657613.html
Copyright © 2011-2022 走看看