代码块02使用细节-Java

news2024/11/24 20:53:30

代码块02使用细节

  • 四、使用细节
    • 1、static代码块/静态代码块,随着类的加载而执行,且只执行一次
    • 2、 类什么时候被加载 [重要 ! ]
      • 案例演示:static代码块
    • 3、普通代码块,在创建对象实例时,会被隐式的调用。
      • 案例演示:普通代码块
    • 4、创建一个对象时,在一个类调用顺序是
      • 案例演示
    • 5、构造器的最前面其实隐含了super()和调用普通代码块
      • 案例演示
    • 6、创建一个子类时(继承关系),调用顺序
      • 案例演示
    • 7、静态代码块只能直接调用静态成员(静态属性和静态方法)

四、使用细节

1、static代码块/静态代码块,随着类的加载而执行,且只执行一次

static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次。

如果是普通代码块,每创建一个对象,就执行。

2、 类什么时候被加载 [重要 ! ]

① 创建对象实例时(new)
② 创建子类对象实例,父类也会被加载
③ 使用类的静态成员时(静态属性,静态方法)

案例演示:static代码块

① 创建对象实例时(new)

public class CodeBlockDetail01 {
    public static void main(String[] args) {
        A aa = new A();
    }
}

class A {
    static {
        System.out.println("AA的静态代码块");
    }
}

在这里插入图片描述

② 创建子类对象实例,父类也会被加载

public class CodeBlockDetail01 {
    public static void main(String[] args) {
        B b = new B();
    }
}

class A {
    static {
        System.out.println("父类A的静态代码块");
    }
}

class B extends A {
	static {
        System.out.println("子类B的静态代码块");
    }
}

在这里插入图片描述

③ 使用类的静态成员时(静态属性,静态方法)
使用静态属性或者静态方法的时候,类已经加载

public class CodeBlockDetail01 {
    public static void main(String[] args) {
        //③ 使用类的静态成员时(静态属性,静态方法)
        System.out.println(Cat.n1);
    }
}
class Cat {
    public static int n1 = 999;
    static {
        System.out.println("cat 的静态代码块");
    }
}

在这里插入图片描述
static代码块/静态代码块,随着类的加载而执行,且只执行一次

public class CodeBlockDetail01 {
    public static void main(String[] args) {
        D d = new D();
        D d1 = new D();

    }
}
class D {
    static{
        System.out.println("DD的静态代码块");
    }
}

在这里插入图片描述

3、普通代码块,在创建对象实例时,会被隐式的调用。

普通代码块,在创建对象实例时,会被隐式的调用。每创建一次,就会调用一次。
如果只是使用类的静态成员时,普通代码块并不会执行。

案例演示:普通代码块

① 普通代码块,被创建一次,就会调用一次。

	//【main】
	 D d = new D();
	 D d1 = new D();
	
	class D {
	    static{
	        System.out.println("D的static静态代码块");
	    }
	    {
	        System.out.println("D的普通代码块");
	    }
	}

在这里插入图片描述
② 只是使用类的静态成员时,普通代码块并不会执行。
注意:静态代码块一定会执行。

	//【main】
	System.out.println(D.n2);
	
	class D {
	    public static int n2 = 8888;
	    
	    static{
	        System.out.println("D的static静态代码块");
	    }
	    
	    {
	        System.out.println("D的普通代码块");
	    }
	}

4、创建一个对象时,在一个类调用顺序是

创建 一个对象 时,在 一个类 调用顺序是 (重点,难点)∶

① 调用静态代码块静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)

② 调用普通代码块普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)

补充:这里暗含了顺序,①中的静态代码块和静态属性初始化 一定比②的调用。

③ 调用构造方法。

案例演示

① 静态代码块和静态属性初始化调用的优先级一样,按照定义的顺序调用。

//【main】
A a = new A();

class AA {
    //静态属性初始化
    private static int n1 = getN1();

    //静态代码块
    static {
        System.out.println("A的静态代码块0101");
    }

    public static int getN1() {
        System.out.println("getN1()被调用");
        return 100;
    }
}

在这里插入图片描述
修改代码顺序为:

class AA {
    //静态代码块
    static {
        System.out.println("A的静态代码块0101");
    }

    //静态属性初始化
    private static int n1 = getN1();
    
    public static int getN1() {
        System.out.println("getN1()被调用");
        return 100;
    }
}

在这里插入图片描述
② 普通属性初始化 & 普通代码块

class AA {
    //普通属性
    private int n2 = getN2();
    //普通代码块
    {
        System.out.println("普通代码块0101");
    }
    public int getN2() {
        System.out.println("getN22()被调用");
        return 200;
    }
}

在这里插入图片描述

5、构造器的最前面其实隐含了super()和调用普通代码块

构造器的最前面其实隐含了super()和调用普通代码块。
静态相关的代码块、属性初始化,在类加载时,就已经执行完毕。
因此是优先于构造器和普通代码块执行的。

class A {
	public A() {// 构造器
		//这里有隐藏的执行要求
		// (1) super() 
		// (2) 调用普通代码块
		System.out.println("A的构造器");
	}
}

案例演示

CodeBlockDetail03.java

//【main】
BBB bbb = new BBB();

class AAA {
    {
        System.out.println("AAA的普通代码块···");
    }
    public AAA() {// 构造器
        //这里有隐藏的执行要求
        // (1) super() - AAA 的父类是Object
        // (2) 调用普通代码块
        System.out.println("AAA的构造器···");
    }
}

class BBB extends AAA{
    {
        System.out.println("BBB的普通代码块···");
    }
    public BBB() {// 构造器
        //这里有隐藏的执行要求
        // (1) super()
        // (2) 调用普通代码块
        System.out.println("BBB的构造器···");
    }
}

在这里插入图片描述

6、创建一个子类时(继承关系),调用顺序

创建一个子类时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:

//面试题
A(子类)->B(父类)
① 父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
② 子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
····································注意此时类加载完成································
③ 父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
④ 父类的构造方法
⑤ 子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
⑥ 子类的构造方法

以 class B02 extends A02 为例。
【分析】new B02();
(1) 进行类的加载
1.1 先加载 父类 A02 。1.2 再加载 B02
-加载子类的时候,一定要有父类,(比如先加载Object类)
-加载的时候,进行静态属性初始化 & 静态代码块
(静态属性初始化 & 静态代码块与类加载相关,优先级一样,取决于代码顺序)
(2) 创建对象
2.1 从子类的构造器开始
子类构造器隐藏了①super()②普通代码块 & 普通属性相关···

案例演示

CodeBlockDetail04.java

7、静态代码块只能直接调用静态成员(静态属性和静态方法)

静态代码块只能直接调用静态成员( 静态属性和静态方法 ),普通代码块可以调用任意成员。

本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1258238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023 中国 Serverless 用户调查,邀您填写!

当前云计算已成为数字时代的基础设施,支撑众多企业进行数字化转型升级。随着企业上云的范围更加广泛,国内云计算正在迈向云原生时代。Serverless技术因其以应用为中心、屏蔽底层复杂逻辑,灵活扩展,按需取用的特点,已经…

【解决方案】安科瑞智能照明系统在福建二建大厦项目上的研究与应用

【摘要】:智能化已经成为当今建筑发展的主流技术、涵盖从空调系统、消防系统到安全防范系统以及完善的计算机网络和通信系统。但是长期以来、智能照明在国内一直被忽视、大多数建筑物仍然沿用传统的照明控制方式、部分智能大厦采用楼宇自控(BA&#xff0…

如何在vs2017及以前版本(vs2010、vs2015)上添加 添加类型库中的MFC类

有时候当我们新建MFC工程需要使用到微软的一些自带控件,如播放视频要用到Windows media player控件,这时,我们可以通过添加“ActiveX控件中的mfc类(A)”这一选项. 还有有时候我们需要用到“类型库中的MFC类(T)及“MFC ODBC使用者(O)”。那我们…

如何获取抖音订单API数据接口?

在开放平台中,每个API接口都有相应的文档说明和授权机制,以确保数据的安全性和可靠性。开发者可以根据自己的需求选择相应的API接口,并根据文档说明进行调用和使用。 开放平台API接口是一套REST方式的开放应用程序编程接口,它…

NX二次开发UF_CURVE_create_arc_point_center 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_point_center Defined in: uf_curve.h int UF_CURVE_create_arc_point_center(tag_t point, tag_t center, UF_CURVE_limit_p_t limit_p [ 2 ] , tag_t support…

Clion取消double shift(按两下shift键)全局搜索

Clion 取消 double shift(按两下 shift 键)全局搜索。 如下图所示打开 setting。 点击 advanced setting,搜索 disable,取消勾选左侧复选框,点击 ok。

Linux进程状态(僵尸进程,孤儿进程)+进程优先级+进程调度与切换

Linux进程状态[僵尸进程,孤儿进程]进程优先级 一.进程状态1.进程排队2.教材上对于进程状态的描述:1.阻塞挂起 3.Linux下具体的进程状态:1.Linux下的进程状态数组2.R3.S:可终止睡眠---浅度睡眠1.补充:前台进程和后台进程2.一种"奇怪"的现象 4.D:不可终止睡眠---深度睡…

ESXi 添加虚拟闪存 无可选设备问题排查

虚拟内存是计算机系统中的一种技术,它可以将计算机硬盘的一部分空间作为临时存储器来使用。当计算机的物理内存(RAM)不足时,操作系统可以将部分数据从内存移至硬盘的虚拟内存空间中,以释放内存供其他程序使用。虚拟内存…

C++基础 -4- C/C++混合编程

引用格式(图片代码段呈现) extern "C" {#include "string.h" }代码验证 (分别使用了C/C 的标准输出) #include "iostream"using namespace std;extern "C" { #include "stdio.h" #include "…

Arthas 使用

Arthas是阿里巴巴开源的Java诊断工具,采用命令行交互的形式进行问题的定位与诊断。它能够帮助你. 解决以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我…

卸载软件最最最彻底的工具——Uninstall Tool

卸载软件最最最彻底的工具——Uninstall Tool Uninstall Tool 是一款功能强大的专业卸载工具。针对一些普通卸载不彻底的问题,它可以做到最优,比如Matlab等软件的卸载难的问题也可以较好地解决。 它比 Windows 自带的“添加/删除程序”功能快 3 倍&…

深度学习:全面了解深度学习-从理论到实践

深度学习:全面了解深度学习-从理论到实践 摘要:本文旨在为读者提供一份全面的深度学习指南,从基本概念到实际应用,从理论数学到实践技术,带领读者逐步深入了解这一领域。我们将一起探讨深度学习的历史、发展现状&#…

算法通关第十七关青铜挑战——原来贪心如此简单(什么是贪心思想and经典例题分析)

大家好,我是怒码少年小码。 一转眼,又到了11月末尾了,莫名感觉今年真的很快😂。今天的主角是贪心。 贪心的思想非常不好解释,而且越使用权威的语言解释越难懂。而且做题的时候根据自己的理解可能直接做出来&#xff…

Ubuntu 22.03 LTS 安装deepin-terminal 分屏

安装 源里面自带了这个软件,可以直接装 sudo apt install deepin-terminal 启动 按下Win键,输入deep即可快速检索出图标,点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口,鼠标点击可以切换…

C#常见的设计模式-结构型模式

引言 设计模式是软件工程中用于解决常见问题的可复用解决方案。在C#编程中,常见的设计模式具有广泛的应用。本篇博客将重点介绍C#中常见的结构型设计模式,包括适配器模式、装饰器模式、代理模式、组合模式和享元模式。 目录 引言1. 适配器模式(Adapter …

便利高效双赢:无人机油气管道巡检全面升级

我国庞大的油气管道网络,包括原油、成品和天然气管道,因为地理区域广泛、建设年代久远、安全事故频发等现实因素,对管道的安全巡护与管理提出了更高的需求。在这一背景下,传统的人工巡护方式显然已经难以满足对高、精、准的要求。…

【受体 + 二系统 】

GPCR A级超家族家庭成员/基因评论胺受体受体的六个亚家族总共包括45个基因(其中4个是假基因);这六个亚家族是5-羟色胺(5-HT,血清素)受体(13个基因),多巴胺受体(5个基…

瑞数五代ast反混淆笔记一

第一部分 瑞数五代ast反混淆笔记一 文章目录 前言一、分析第一层js文件二、转换为switch-case三、效果图总结 前言 瑞数五代的反混淆做了很久了,当时写的很复杂,也没有记笔记,现在看代码都看不懂了,重新归顺下逻辑思路 一、分析第…

Bitcoin SV 和 Bitcoin Core 之间首次跨链原子交换

我们已经执行了 Bitcoin SV 和 Bitcoin Core 之间的首次原子交换。 这一成就代表了比特币 SV 的重大进步,以去信任的方式促进了与其他区块链的无缝互操作性。 图片源自Gemini 在上一篇文章中,我们解释了原子交换的高级理论。 我们深入研究了使用哈希时间…

供配电系统智能化监控

供配电系统智能化监控是指利用先进的监测技术、自动化控制技术、计算机网络技术等,对供配电系统进行实时、全方位的监测和控制,以实现供配电系统的安全、稳定、高效运行。 供配电系统智能化监控的主要功能包括: 实时数据采集:通过…