Java类 初始化顺序 | 静态数据的初始化

简介: Java类 初始化顺序 | 静态数据的初始化
public class StaticInit1 {
    StaticInit1(){
        System.out.println("StaticInit_1_init");
    }
    StaticInit1(int i){
        System.out.println("StaticInit_1_init,int i ="+i);
    }
}
public class StaticInit {
    StaticInit1 s2 = new StaticInit1(1);
    public StaticInit() {
        System.out.println("StaticInit-init");
    }
    static StaticInit1 s1 = new StaticInit1();
    public static void main(String[] args) {
        new StaticInit();
        /* output:
            StaticInit_1_init
            StaticInit_1_init,int i =1
            StaticInit-init
         */
    }
}

根据输出结果,可以发现

在初始化 StaticInit类时,先初始化了类的静态变量. 再是执行了变量s2的初始化,最后 才是类构造器的执行输出

对StaticInit类再加一个f()方法

public class StaticInit {
    StaticInit1 s2 = new StaticInit1(1);
    public StaticInit() {
        System.out.println("StaticInit-init");
    }
    static StaticInit1 s1 = new StaticInit1();
    void f(){
        new StaticInit();
    }
    public static void main(String[] args) {
        new StaticInit().f();
        /* output:
            StaticInit_1_init
            StaticInit_1_init,int i =1
            StaticInit-init
            StaticInit_1_init,int i =1
            StaticInit-init
         */
    }
}

查看输出结果 , 通过f()方法再次(第二次执行)创建Staticinit类时,初始化类时并未执行静态变量的初始化,也就是说 :静态变量的初始化只执行一次.


Next Example


public class Window {
    Window(int i){
        System.out.println("Window==i="+i);
    }
}
public class House {
    Window w1 = new Window(1);
    House(){
        System.out.println("house");
        w3 = new Window(33);
    }
    Window w2 = new Window(2);
    void walk(){
        System.out.println("walk");
    }
    Window w3 = new Window(3);
}
public class OrderOfInit {
    public static void main(String[] args) {
        House house = new House();
        house.walk();
    }
    /* Output:
            Window==i=1
            Window==i=2
            Window==i=3
            house
            Window==i=33
            walk
     */
}

静态数据初始化


public class Bowl {
    Bowl(int i) {
        print("Bowl->i="+i);
    }
    void f1(int i){
        print("f1->i="+i);
    }
}
public class Table {
    static Bowl b1 = new Bowl(1);
    Table(){
        print("Table");

    }
    Bowl b3 = new Bowl(3);
    void f2(int i){
        print("f2->i="+i);
    }
    static Bowl b2 = new Bowl(2);
}
public class Cupboard {
    Bowl b4 = new Bowl(4);
    static Bowl b5 = new Bowl(5);
    Cupboard(){
        print("cupboard");
        b4.f1(2);
    }

    void f3(int i){
        print("f3->i="+i);
    }
    static Bowl b6 = new Bowl(6);
}
public class StaticInit {
    public static void main(String[] args) {
        new Cupboard();
        new Cupboard();
        table.f2(1);
        cupboard.f3(1);
    }
    static Table table = new Table();
    static Table table1 = new Table();
    static Cupboard cupboard = new Cupboard();
    /*Output:                 产生输出对应的语句
        Bowl->i=1
        Bowl->i=2            static Table table = new Table();
        Bowl->i=3
        Table
        -----------
        Bowl->i=3            static Table table1 = new Table();
       Table
       -----------
        Bowl->i=5
        Bowl->i=6
        Bowl->i=4            static Cupboard cupboard = new Cupboard();
        cupboard
        f1->i=2
        -----------
        Bowl->i=4
        cupboard             new Cupboard();
        f1->i=2
        -----------
        Bowl->i=4
        cupboard              new Cupboard();
        f1->i=2
        -----------
        f2->i=1               table.f2(1);
        f3->i=1             cupboard.f3(1);
     */
}

封装System.out.println输出语句


只能打印字符串…

public class Print {
    public static void print(String something){
        System.out.println(something);
    }
}

以静态方式引入

import static edu.Print.print;
相关文章
|
5月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
289 3
|
5月前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
293 101
|
5月前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
327 100
|
4月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
171 4
|
4月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
260 5
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
246 1
|
4月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
344 5
|
4月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
304 1
|
4月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
238 0
|
4月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
261 1