在Java中要想实例化一个对象必须调用构造器,调用构造器这个类必须在jvm已经被加载了,在类加载和对象初始化的过程有些顺序问题是值得我们去留意的

一个Java类中主要包含以下几部分:

静态代码块:在类加载完的时候就执行可以调用静态成员,在整个类的生命周期只执行一次,优先于该类中的main方法执行。

静态属性、静态方法:随着类的加载而加载,类加载了静态变量静态方法就存在了,是所有对象所共享的。

构造代码块:每次实例化对象都会执行且优先于构造方法。

构造方法:实例化对象是调用。

成员变量:普通变量。

成员方法:普通方法。

这些部分中构造器是必须的,一个类默认有一个无参数的构造器,如果自定义了一个有参数的构造器,那无参构造器就没了需要显式的写出来

下面我们就来看下,实例化一个对象会经历那些步骤。

package com.lcx.tj.test;
/*** * @author*/
class Father {private String name = "张三";//姓名,显式赋值初始化private String job = "老师";//职业,显式赋值初始化//测试默认初始化String String_;Father Father_;byte byte_;short short_;int int_;long long_;float float_;double double_;char char_;boolean boolean_;//静态代码块,在类加载完的时候就执行可以调用静态成员,在整个类的生命周期只执行一次,优先于该类中的main方法执行。static {System.out.println("Father静态代码块 begin------------");System.out.println("调用静态方法doSometing");doSometing();sex = "男";System.out.println("Father静态代码块 over------------");}/** 静态属性、静态方法随着类的加载而加载*/public static final String sex;public static void doSometing(){System.out.println("Father静态方法doSometing:照顾小孩");}{//构造块,每次实例化对象都会执行且优先于构造方法System.out.println("Father构造块");}public Father(){System.out.println("Father无参数构造器"); }public Father(String name, String job) {System.out.println("Father有参数构造器");this.name = name;this.job = job;}//主方法public static void main(String[] args) {System.out.println("Father主方法");/*** 1、类首次加载 静态属性静态方法已经存在,执行静态代码块* 2、实例化对象时 会先执行构造块 然后调用构造器* 需要注意:* 调用构造器生成对象时,非静态属性会先进行赋值初始化,如果没有赋值就会采取默认初始化,如果是对象默认初始化为null如果是基本类型会初始化为相应的值。* 但是我们在普通的方法中定义了基本类型或者对象没有进行显式的赋值初始化就去使用 是会编译出错的。*///没有进显式的赋值初始化就去使用 会编译报错的。
//      Father f8 ;
//      f8.toString();
//      int i;
//      System.out.println(i);Father f1 = new Father();System.out.println("Father toString():"+f1);Father f2 = new Father("李四", "程序员");System.out.println("Father toString():"+f2);}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}@Overridepublic String toString() {return "Father [name=" + name + ", job=" + job + ", String_=" + String_ + ", Father_=" + Father_ + ", byte_="+ byte_ + ", short_=" + short_ + ", int_=" + int_ + ", long_=" + long_ + ", float_=" + float_+ ", double_=" + double_ + ", char_=" + char_ + ", boolean_=" + boolean_ + "]";}}

程序运行结果:


如果这个有一个子类呢?在实例化子类对象的时候 顺序又是咋样的呢?那我们接下再瞅瞅。

先看下子类代码:

class Son extends Father{private String grade;//班级//静态代码块,在类加载完的时候就执行可以调用静态成员,在整个类的生命周期只执行一次,优先于该类中的main方法执行。static {System.out.println("Son静态代码块");}{//构造块,每次实例化对象都会执行且优先于构造方法System.out.println("Son构造块");}public Son() {super();System.out.println("Son无参数构造器");}public Son(String grade,String name,String job) {super(name,job);System.out.println("Son有参数构造器");this.grade = grade;}//静态属性public static final String like = "小女孩";//静态方法public static void doSometing(String a){System.out.println("Son学习");}//主方法public static void main(String[] args) {System.out.println("Son主方法");Son s1 = new Son();System.out.println("Son toString:"+s1);Son s2 = new Son("五年级", "王五", "学生");System.out.println("Son toString:"+s2);}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}@Overridepublic String toString() {return "Son [grade=" + grade + ", getName()=" + getName() + ", getJob()=" + getJob() + "]";}}

程序运行结果:

最后我们总结一下初始化一个对象要经历那些步骤,其实很简单, 如果类是首次加载 就先加载类 然后调用 构造器就OK。

加载类class执行静态代码块-->类构造块-->类构造器。

如果是子类实例化的话,其实也一样,只不过 先有父对象在 再才有子对象,所有 先加载父类class再加载子类class 然后 先调用父构造器 再调用子构造器。

加载父类class执行父类静态代码块-->加载子类class执行子类静态代码块-->父类构造块-->父类构造器-->子类构造块-->子类构造器。

以上均是个人的一些理解哈,如果有不对的地方敬请指教。

深入研究Java中一个对象的初始化过程相关推荐

  1. java中对象的初始化过程

    class Parent{int num = 8;// ->3Parent(){//super(); // ->2//显示初始化 // ->3//构造代码段 // ->4sho ...

  2. php中继承过来的类初始化顺序,java_图文详解Java中class的初始化顺序,class的装载 在讲class的初始化 - phpStudy...

    图文详解Java中class的初始化顺序 class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序. 以下摘自<Thinking in Java 4> 由于Java ...

  3. 初始化器 java_来说说Java中的实例初始化器

    原标题:来说说Java中的实例初始化器 (点击上方公众号,可快速关注) 英文:programcreek 译文:strongme 链接:http://www.importnew.com/12893.ht ...

  4. java socket分包粘包 代码_分享java中处理socket通信过程中粘包情况的实例代码

    本篇文章主要介绍了java中处理socket通信过程中粘包的情况,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这两天学习了java中处理socket通信过程中粘包的情况,而且很重要,所以,今天添 ...

  5. java 初始化块_详解Java中的实例初始化块(IIB)

    在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详细介绍下吧. Java 语言中,存在三种操作:方 ...

  6. Java中数组怎么初始化?数组初始化方法

    关于Java中数组怎么初始化的文章早已是非常多了,本文是对我个人过往学习Java,理解及应用Java数组的一个总结.此文内容涉及Java中数组初始化的三大方法等相关问题,希望对大家有所帮助. Java ...

  7. 请说明一下JAVA中反射的实现过程和作用分别是什么?

    请说明一下JAVA中反射的实现过程和作用分别是什么? Java语言编译后形成.class文件,反射就是通过字节码文件找到一个类,类中的方法及属性等.反射的实现主要通过四个类 Class 类的对象 Co ...

  8. Java:对象创建和初始化过程

    1.Java中的数据类型     Java中有3个数据类型:基本数据类型(在Java中,boolean.byte.short.int.long.char.float.double这八种是基本数据类型) ...

  9. JAVA学习第五篇--java中对象的创建过程以及函数的调用过程

    下面本文将详细介绍java语言中对象的创建过程,以及函数的调用过程. class Person{public String name="zhao";public int ege;p ...

最新文章

  1. JS+CSS点击弹出登陆框代码
  2. Association Rules 关联规则
  3. Python_Note_08Day_10_03_JQuery
  4. HTML坦克大战学习02---坦克动起来
  5. python安装pandas模块-python安装numpy和pandas的方法步骤
  6. 高效CSS的一些建议
  7. unbuntu管理员的切换
  8. 兜兜转转,回到原点,Hello Mr.my yesterday
  9. 卫星电话是直接与卫星通信还是通过地面站?
  10. dos下\与/有什么区别
  11. error: skipping because parent directory has insecure permissions问题
  12. android手机截图功能,安卓手机怎么截屏?三星/华为/小米等手机截图方法
  13. Python strip() 函数 去空格 \n \r \t 函数的用法
  14. Java/web/jsp根据pdf模板生成荣誉证书PDF文件
  15. English常用短语
  16. Python 教你训练一个98%准确率的微博抑郁文本分类模型(含数据)
  17. deepin启动盘制作工具_YUMI——多重引导制作工具
  18. ProFOLD:普通笔记本3小时跑完的蛋白质结构「从头预测」,努力赶超AlphaFold2
  19. 【LINGO】lingo 软件简介
  20. 公文签收系统html模板,公文签收系统完美增强司法版asp源码

热门文章

  1. 依赖倒置原则_设计模式之SOLID原则
  2. 1.9 编程基础之顺序查找 11 连续出现的字符 python
  3. windows下环境变量配置后没生效,不重启电脑的解决办法
  4. requirejs整合art-template模板引擎
  5. python读取txt文件每一行存为列表,从txt文件中读取一定数量的行,并以python方式转换为list...
  6. python实训内容_Python实验课:Python元组数据及其运算
  7. C++|STL学习笔记-map的属性(大小以及是否存在)
  8. OpenCV文档阅读笔记-inRange官方解析及实例
  9. C++工作笔记-C++中assert的作用
  10. linux mint 19界面美化,安装完 LinuxMint 19.3 后必做的10件事