java基础——类的初始化、实例化流程

Java中类的初始化与实例化总结(类初始化的触发时机,类的实例化触发时机,new一个对象的过程) 全是干货,一网打尽类的基础知识!先看看下面的问题都能回答上来吗? 描述new一个对象的过程,并结合例子说明。 类初始化的触发时机。 多线程进行类的初始化会出问题吗? 类的实例化触发时机。 <clinit>()方法和<init>()方法区别。 在类都没有初始化完毕之前,能直接进行实例化相应的对象吗? 类的初始化过程与类的实例化过程的异同? 一个实例变量在对象初始化的过程中会被赋值几次? 描述new一个... 阅读详情

父类

public class Father {

    private int i = test();
    private static int j = method();

    static {
        System.out.println("(1)");
    }

    Father() {
        System.out.println("(2)");
    }

    {
        System.out.println("(3)");
    }

    public int test(){
        System.out.println("(4)");
        return 1;
    }

    private static int method() {

        System.out.println("(5)");
        return 1;
    }
}

子类

public class Son extends Father{
    private int i = test();
    private static int j = method();

    static {
        System.out.println("(6)");
    }

    Son() {
        //super();//写或不写都存在,再子类构造器中,一定会调用父类构造器
        System.out.println("(7)");
    }

    {
        System.out.println("(8)");
    }

    public int test(){
        System.out.println("(9)");
        return 2;
    }

    private static int method() {

        System.out.println("(10)");
        return 2;
    }

    public static void main(String[] args) {
        Son son1 = new Son();

        System.out.println();

        Son son2 = new Son();
    }
}

写出父类和子类实例化过程的输出。

分析一波:

main被执行时:

一、类初始化
子类初始化<clinit>(由两部分构成 1,类变量显示赋值代码,2,静态代码块 (没有先后顺序,谁写在上面谁先执行))
        1、j=method(); (static 变量) 
        2、子类的静态代码块

此时,应该先初始化父类   输出:(5) (1)  //父类类变量显示赋值代码写在静态代码块之上

再初始化子类  输出:(10) (6)

二、子类的实例初始化方法<init>
(1)super()  (最前)   //(9)(3)(2)  这部分是父类在执行
(2)i=test();  (9)
 (3)子类的非静态代码块    (8)
 (4)子类的无参构造器  (最后)   (7)
因为创建了两个 son对象  所以 子类实例初始化方法 <init> 被执行两次  932987

要想知道为什么是上面的结果,先看一下父类真实的加载顺序

父类初始化<clinit>(由两部分构成 1,类变量显示赋值代码,2,静态代码块 (没有先后顺序,谁写在上面谁先执行))
     1、j=method();  (5) 
     2、父类静态代码块  (1)

     二、父类的的实例初始化方法
  * (1)super()  (最前)
  * (2)i=test; //此处,由于多态问题 执行的应该是 (9)
  *  3)父类的的非静态代码块  (3)
  *  4)父类的的无参构造器  (2)


  非静态方法前面其实有一个默认对象 this
  this在构造器(或<init>) 它表示的是正在创建的对象,因为是正在创建son对象,
  所以 test()执行的是子类重写的代码(面向对象 多态)

  这里i=test() 执行的是子类重写的test() 方法

所以最终输出结果为

(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)

(9)(3)(2)(9)(8)(7)

本题的考点是

  • 类的初始化过程
  • 实例初始化过程
  • 方法的重写

类的初始化过程:

(1)一个类要创建实例需要先加载并初始化该类

  • main方法所在的类需要先加载和初始化

(2)一个子类要初始化需要先初始化父类

(3)一个类初始化就是执行<clinit>()方法

  • <clinit>()方法由静态类变量显示赋值代码和静态代码块组成
  • 类变量显示赋值代码和静态代码块代码从上到下顺序执行
  • <clinit>()方法只执行一次

<clinit>() class initializes 类初始化方法,系统自动赋予的,在字节码文件中 可以看见

由此可见,即使上述例子中,即使main中没有任何代码,最终输出结果也会是

5 1 10 6 因为,类的加载 是在对象实例化之前就已经完成的。

实例初始化过程

(1)实例初始化就是执行<init>0 方法

  • <init>()方法可能重载有多个,有几个构造器就有几个<init>方法
  • <init>()方法由非静态实例变量显示赋值代码和非静态代码块、对应构造器代码组成
  • 非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应
    构造器的代码最后执行
  • 每次创建实例对象,调用对应构造器,执行的就是对应的<init>方法
  • <init>方法的首行是super() 或super(实参列表),即对应父类的<init>方法

方法的重写(Override)

(1)哪些方法不可以被重写

  • final方法
  • 静态方法
  • private等子类中不可见方法

(2)对象的多态性

  • 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码
  • 非静态方法默认的调用对象是this
  • this对象在构造器或者说<init>方法中就是正在创建的对象

此处,,我们顺便回顾一下Override 和Overload

Override的重写要求?

方法名

形参列表

参数列表必须完全与被重写的方法参数列表相同。

返回值类型

返回的类型必须与被重写的方法的返回类型相同 (Java1.5 版本之前返回值类型必须一样,之后的 Java 版本放宽了限制,返回值类型必须小于或者等于父类方法的返回值类型)

抛出的异常列表

重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的检査型异常。 例如,父类的一个方法声明了一个检査异常 IOException,在重写这个方法时就不能抛出 Exception,只能拋出 IOException 的子类异常

修饰符

访问权限不能比父类中被重写方法的访问权限更低 (public>protected>default>private)

另外还要注意以下几条:

重写的方法可以使用 @Override 注解来标识。

父类的成员方法只能被它的子类重写。

声明为 final 的方法不能被重写 。

声明为 static 的方法不能被重写,但是能够再次声明。

构造方法不能被重写。

子类和父类在同一个包中时,子类可以重写父类的所有方法, 除了声明为 private 和 final 的方法。

子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法。 如果不能继承一个方法,则不能重写这个方法。

027_对象实例化流程(内存分配 / 初始化) Java对象实例化是通过new关键字创建对象的过程,由JVM完成,核心流程为类加载检查、内存分配、初始化、返回引用。 类加载检查确认类是否加载,未加载则先加载。内存分配在堆中进行,大小由类属性决定,有指针碰撞和空闲列表两种方式。初始化分默认、显式、构造器三阶段,依次覆盖赋值。最后JVM将对象引用返回给变量。注意初始化不可跳过,构造器仅负责最终初始化,实例化可能失败。 阅读详情

相关推荐

Java对象的实例化过程是怎样的?

但如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“除如何划分可用空间之外,还有另外一个需要考虑的问题:对象创建在虚拟机中是非常频繁的行为,即使仅仅修改一个指针所指向的位置,在并发情况下也并不是线程安全的,可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。

流楚丶格念的博客 3611

java类的初始化

java类的加载过程主要分为三个阶段:加载-链接(验证、准备、解析)-初始化,本文重点研究初始化阶段干了什么

baidu_40120883的博客 3150

RPCA模型及GoDec算法

一、基础知识 在线性代数中,秩的物理意义是矩阵中最大的不相关的向量个数,因此秩可以用来度量相关性;而在图像处理中,秩就可以理解为图像中所包含的信息的丰富程度。图片中比较突兀的成分,会增加图像矩阵的秩,一幅清晰的自然图像其数据矩阵往往是低秩或者近似低秩的,这是因为其中的图像信息有很大的相关性,但如果图像中引入噪声,那么存在随机幅值任意大但是分布稀疏的误差破坏了原有数据的低秩性。 低秩矩阵:如果AAA是一个m×nm×nm×n的矩阵,rank(A)rank(A)rank(A)是矩阵AAA的秩,如果rank(A)

小席的学习日志 7687

Java 类的初始化

Java类加载的详细过程与相关规则

suming97的博客 4085

从零到一:RF-DETR如何通过神经架构搜索重塑实时目标检测的边界

RF-DETR通过创新的权重共享神经架构搜索(NAS)机制,重新定义了实时目标检测的技术边界。这项技术在COCO等基准测试中表现卓越,成为首个AP超过60的实时检测器,同时保持跨领域稳定性和高效推理速度。RF-DETR的动态架构调整能力使其能够适应从嵌入式设备到云端服务器的各种硬件环境,为工业质检、自动驾驶等场景提供灵活解决方案。

weixin_29061531的博客 469

AutoCAD二次开发(.Net)之XData

对于CAD中的实体进行筛选等操作,常常会用到实体的XData属性,下面介绍一下实体的XData的增删改。 //XData的新增,修改跟新增一样,new一个ResultBuffer,赋值即可 Document doc=Application.DocumentManager.MdiActiveDocument; using (DocumentLock dl = doc.LockDocument()) { using (Transaction trans = doc.TransactionManager.S.

qq_21489689的博客 2593

Java 类初始化(详解)

JVM 如何进行类的初始化,实例的初始化,构造器的作用与调用。

acherie的博客 2万+

ESXI 8.0.3 ubuntu 24.04 直通显卡P40

手把手,一步步教你直通GPU,ESXI 8.0.3 ubuntu 24.04 直通显卡P40

qq_36433118的博客 4683

Java类的初始化

在Java中,类的初始化是自动发生的,无需显式编写代码来执行类的初始化。当满足特定条件时,Java运行时环境会自动触发类的初始化过程。因此,在通常情况下,开发者无需显式编写代码来执行类的初始化。Java运行时环境会在需要的时候自动执行类的初始化过程。

正伯Pro的博客 887

Java黑皮书课后题第5章:*5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生

*5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生名字、次高分的学生名字题目题目概述next()读取一个字符与nextLine()读取一行破题代码 题目 题目概述 *5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生名字、次高分的学生名字 使用Scanner类的next()方法而不是nextLine()方法来读取名字 next()读取一个字符与nextLine()读取一行 举个例子理

weixin_46356698的博客 2155

深度学习【46】pix2pixHD

英伟达的pix2pixHD,能够合成高清的2048*1024图片,简直振奋人心。pix2pixHD是我之前介绍过的pix2pix的改进版本,使用多由粗到精的G网络和多尺度D网络(每个D网络都是用了pix2pix中同样的patch技术)。论文一开始用pix2pix尝试合成更高分辨率的图片,但发现效果不好,训练也很不稳定。所以就对pix2pix进行了一顿魔改。我们来看看他们是怎么改进的。由粗到精的G网络

DCD_LIN的博客 1万+

Java类初始化、实例化流程你真的清楚吗

1、Java类初始化流程? 2、Java类实例化流程? 3、Java父类和子类在初始化、实例化、方法重写时的体现

健身变秃,coding变强 1995

SAP 52策略测试简介

我们看下下层物料的需求,可以看到物料的需求已经跑出来了,我们双击计划订单,发现是没有办法将计划订单转换为采购申请的,这里是否还记得我们在前面创建主数据的时候独立集中我们填写的是1,所以物料继承了上层物料的策略,所以不能将计划订单进行转换。我们在前面测试了50策略按单生产,创建完计划独立需求后,通过主数据中的独立集中的字段控制下层物料是否能通过计划订单转成生产订单和采购订单。可以看到下层物料的计划订单就可以转采购申请了,到这里可以看到52策略和50策略的计划独立需求完全是一样的。

我小时候很黑的博客 1272

类的初始化过程,类的实例化过程

一个类进行初始化或实例化时,一定会先对其父类进行初始化或实例化。 类的初始化过程 子类进行初始化:(1)父类进行初始化 (2)子类的静态成员变量、静态代码块进行初始化 父类进行初始化:(1)父类的静态成员变量、静态代码块进行初始化 注意:静态成员变量、静态代码块有先后顺序,谁在上先初始化谁 类的实例化过程 子类进行实例化:(1)父类进行初始化 (2)子类进行初始化 ...

weixin_44616792的博客 319

SCADA|KingSCADA通过组合框选择修改变量的值

《SCADA项目中组合框控件的使用方法》 本文详细介绍了SCADA系统中组合框(下拉框)控件的应用方法。通过具体示例演示如何实现:当选择"雷工笔记"时变量值为100,选择"雷工杂谈"时为200,选择"小李食代"时为300的功能。主要实现步骤包括:1)创建项目并添加组合框控件;2)设置Items选项及对应数值;3)创建内存变量;4)使用GetCurrentIndex()和GetItemData()方法;5)在选项变化事件中编写脚本。该控件在SCADA

做有价值的事,积累有价值的笔记! 864

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java类的 初始化 和 实例化区别

类的初始化:是完成程序执行前的准备工作。在这个阶段,静态的(变量,方法,代码块)会被执行。同时在会开辟一块存储空间用来存放静态的数据。初始化只在类加载的时候执行一次。类的实例化:是指创建一个对象的过程。这个过程中会在堆中开辟内存,将一些非静态的方法,变量存放在里面。在程序执行的过程中,可以创建多个对象,既多次实例化。每次实例化都会开辟一块新的内存。 1.主要区别 2.基础知识 2.1 java类的生命周期: 指一个class文件从加载到卸载的全过程,类的完整生命周期包括7个部分:...

fox_bert的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java中的类装载和初始化模块

AlienTech for better life!~

AlienTech for better life!~ 2192

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java实例化继承类_继承关系的类初始化和实例化的顺序

就像之前的一个评论.我们学习的是思路. 很多人都知道继承关系的类的初始化和实例化的顺序,但如果忘记了怎么办? 如何找到自己的答案? 又如果遇到的问题是关于泛型的擦除问题,又该如何去分析?思路,重点是思路.泛型擦除先不谈.看继承. 首先给出一个例子,看看它的输出是什么.publicclassA{privatestaticStringa="NA";privateStringi="NA";{i...

weixin_33363265的博客 422

Java类初始化和实例化

文章目录一、类初始化二、类实例化 一、类初始化 什么时候类会进行初始化? 1、包含main方法的类会进行初始化 2、子类初始化会触发父类的初始化 类初始化的过程中都干了什么? 1、调用ciinit()方法,只执行一次:这个方法中一般是一些静态变量的显示赋值语句和静态代码块,赋值语句优先静态代码块执行 二、类实例化 什么时候会进行实例初始化? 1、 new 2、class.newInstance 类实例化的过程中都干了什么? 1、调用init()方法,可能有多个,有几个构造器就有几个init:这个方法中

peanut的博客 240

Java类初始化及实例化过程

类的初始化过程 1)、具体操作 ①静态成员变量的显式赋值代码 ②执行静态代码块 2)、实质 编译器将这两部分代码在.class字节码文件中合为一个名<clinit>()的初始化方法 3)、执行顺序 在实例化方法执行之前,只执行一次: ①和②与其所定义的顺序有关 实例化过程 1)、具体操作 ①成员变量显式赋值(有可能涉及到方法(重载问题)) ②执行非静态代码块 ③执行构造器 2)、实质 ...

qq_41891805的博客 660

Java类的连接与初始化 (及2013阿里初始化笔试题解析)

原文出处: iceAeterna   Java虚拟机通过装载、连接、初始化来使得一个Java类型可以被Java程序所使用,如下图所示,其中连接过程又分为验证、准备、解析三个部分。其中部分类的解析过程可以推迟到程序真正使用其某个符号引用时再去解析。 解析过程可以推迟到类的初始化之后再进行,但这是有条件的,Java虚拟机必须在每个类或接口主动使用时进行初始化。 以下为主动使用的情况:

LittleFatz's 笔记 664

java类的初始化和实例化的初始化(类的初始化过程)

@java类的加载顺序 Java类的加载顺序 父类静态代变量、 父类静态代码块、 子类静态变量、 子类静态代码块、 父类非静态变量(父类实例成员变量)、 父类构造函数、 子类非静态变量(子类实例成员变量)、 子类构造函数。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会...

zfx2013的博客 7861

Java面试题(十九)类初始化顺序

public class T implements Cloneable { public static int k = 0; public static T t1 = new T("t1"); public static T t2 = new T("t2"); public static int i = print("i"); public static ...

岁月不饶人,我亦未曾饶过岁月 7767

java 类变量的初始化_Java中类的定义和初始化示例详解

类的定义类的定义格式//创建类class ClassName{field ;//成员属性/字段method;//方法}class为定义类的关键字,ClassName为类的名字,{ }为类的主体;例如:class Person{public String name ; //成员属性public int age;public void eat(){ // 方法System.out.println("吃...

weixin_29876591的博客 335

一网打尽“类”的初始化实例化知识点

前言 之前说了类加载的过程,但是有的读者表示还是有些面试题还是答不来,所以今天就来总结下类加载、对象实例化方面的知识点/面试题,帮助大家加深印象。全是干货,一网打尽类的基础知识!先看看下...

weixin_38754349的博客 153

继承关系的类初始化和实例化的顺序

一切都是java编译器搞得鬼. JVM只是负责解析字节码.字节码虽然不是最原始的原子汇编码,但字节码已经可以完全解释JVM的指令执行过程了。 AD:WOT2014课程推荐:实战MSA:用开源软件搭建微服务系统 就像之前的一个评论.我们学习的是思路. 很多人都知道继承关系的类的初始化和实例化的顺序,但如果忘记了怎么办? 如何找到自己的答案? 又如果遇到的问题是

desmond的专栏 600
上一篇: java基础——变量的作用域、生命周期、存储位置等
下一篇: java基础 ——关于i++的问题
一条柴_Alex
博客等级 码龄9年 86粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值