Java 静态数据初始化的示例代码

 更新时间:2020年09月16日 08:57:08   作者:laosun  
这篇文章主要介绍了Java 静态数据初始化的示例代码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值;如果它是一个对象引用,那么它的默认初始值就是null

class Bowl {
  public Bowl(int marker) {
    System.out.println("Bowl(" + marker + ")");
  }
 
  void f1(int marker) {
    System.out.println("f1(" + marker + ")");
  }
}
 
class Table {
  static Bowl bowl = new Bowl(1);
 
  public Table() {
    System.out.println("Table()");
    bowl2.f1(1);
  }
 
  void f2(int marker) {
    System.out.println("f2(" + marker + ")");
  }
 
  static Bowl bowl2 = new Bowl(2);
}
 
class Cupboard {
  Bowl bowl3 = new Bowl(3);
  static Bowl bowl4 = new Bowl(4);
 
  public Cupboard() {
    System.out.println("Cupboard()");
  }
 
  void f3(int marker) {
    System.out.println("f3(" + marker + ")");
  }
 
  static Bowl bowl5 = new Bowl(5);
}
 
public class StaticInit {
 
  public static void main(String[] args) {
    //第三步
    System.out.println("Creating new Cupboard in main");
    //第四步
    //因为Cupboard内的静态变量已经初始化完成,所以不再初始化(无论创建多少个对象,静态数据都是只占用一份存储区域)
    //但是里边的类成员变量 bowl3 还是需要进行二次初始化的,因为你这是new对象,所以打印 Bowl(3)
    //然后调用该对象的无参构造函数,打印 Cupboard()
    new Cupboard();
    //第五步
    System.out.println("Creating new Cupboard in main");
    //第六步
    //和第四步一样,执行初始化,打印 Bowl(3),然后调用无参构造函数,打印 Cupboard()
    new Cupboard();
    //第七步
    table.f2(111);
    //第八步
    cupboard.f3(111);
 
  }
    //Java 数据类型、对象引用 和 构造器 之间的初始化顺序 https://www.sunjs.com/article/detail/debedcef327c4872933e0b2f1ac7cb71.html
  //第1步:
  //先初始化静态代码块、
  //Table 类中也含有静态引用变量,所以先去执行bowl引用指向的对象的创建,所以先打印 Bowl(1)
  //然后该类中还有一个静态对象,所以立即去初始化这个静态对象,然后打印 Bowl(2)
  //执行完成以后,正式创建对象,执行Table类的默认无参构造函数,打印 Table()
  //构造函数内 又使用静态变量bowl2 调用了其对象内的方法,所以打印 f1(1)
  //到此这一行代码执行的初始化全部执行完毕
  static Table table = new Table();
  //第2步:
  //初始化 Cupboard 类,因为 Cupboard 类中也含有两个静态对象,所以依次执行 Bowl(4) 和 Bowl(5)
  //在执行Cupboard构造函数之前先执行变量初始化的规则,所以 bowl3 先执行,打印 Bolw(3)
  //然后执行无参构造函数,打印 Cupboard()
  //到此,这行代码的初始化全部执行完毕
  static Cupboard cupboard = new Cupboard();
   
}

执行结果:

Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
Creating new Cupboard in main
Bowl(3)
Cupboard()
Creating new Cupboard in main
Bowl(3)
Cupboard()
f2(111)
f3(111)

以上就是Java 静态数据初始化的示例代码的详细内容,更多关于Java 静态数据初始化的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot @PostConstruct原理用法解析

    SpringBoot @PostConstruct原理用法解析

    这篇文章主要介绍了SpringBoot @PostConstruct原理用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • spring cloud gateway如何获取请求的真实地址

    spring cloud gateway如何获取请求的真实地址

    这篇文章主要介绍了spring cloud gateway如何获取请求的真实地址问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 引入SpringCloud-gateway报错的解决方案

    引入SpringCloud-gateway报错的解决方案

    这篇文章主要介绍了引入SpringCloud-gateway报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 精通Java List 按字段提取对象

    精通Java List 按字段提取对象

    这篇文章主要介绍了精通Java List 按字段提取对象的相关资料,需要的朋友可以参考下
    2023-11-11
  • 深入理解Spring中的Lookup(方法注入)

    深入理解Spring中的Lookup(方法注入)

    “Lookup方法”可以使Spring替换一个bean原有的,获取其它对象具体的方法,并自动返回在容器中的查找结果。下面这篇文章主要给大家介绍了关于Spring中Lookup(方法注入)的相关资料,需要的朋友可以参考下
    2018-05-05
  • IDEA中的yml文件与properties互相转换

    IDEA中的yml文件与properties互相转换

    这篇文章主要介绍了IDEA中的yml文件与properties互相转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • java调用oracle分页存储过程示例

    java调用oracle分页存储过程示例

    这篇文章主要介绍了java调用oracle分页存储过程,需要的朋友可以参考下
    2014-03-03
  • springboot sleuth 日志跟踪问题记录

    springboot sleuth 日志跟踪问题记录

    Spring Cloud Sleuth是一个在应用中实现日志跟踪的强有力的工具,使用Sleuth库可以应用于计划任务 、多线程服务或复杂的Web请求,尤其是在一个由多个服务组成的系统中,这篇文章主要介绍了springboot sleuth 日志跟踪,需要的朋友可以参考下
    2023-07-07
  • MyBatis的嵌套查询解析

    MyBatis的嵌套查询解析

    本篇文章主要介绍了MyBatis的嵌套查询解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java实现多线程轮流打印1-100的数字操作

    Java实现多线程轮流打印1-100的数字操作

    这篇文章主要介绍了Java实现多线程轮流打印1-100的数字操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论