代码块详解

简介: 代码块详解

1.基本介绍

在这里插入图片描述
基本语法
在这里插入图片描述
代码块的好处
1.相当于另外一种形式的构造器((对构造器的补充机制),可以用来做初始化的操作
2.场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的复用性

package codeblock;


public class code1 {
    public static void main(String[] args) {
        new Movie();
        System.out.println("----------------------");
        new Movie("tom");
        System.out.println("----------------------");
        new Movie("jack","jim");
        System.out.println("----------------------");
        new Movie("jacky","tim",20);
    }
}

class Movie{
    private String name;
    private String director;
    private double price;

    {
        System.out.println("电影开始");
        System.out.println("准备观看");
    }
    public Movie() {
        System.out.println("无参构造器被调用");
    }

    public Movie(String name) {
        System.out.println("Movie(String name)被调用");
        this.name = name;
    }

    public Movie(String name, String director) {
        System.out.println("Movie(String name,String director)被调用");
        this.name = name;
        this.director = director;
    }

    public Movie(String name, String director, double price) {
        System.out.println("Movie(String name,String director,double price)被调用");
        this.name = name;
        this.director = director;
        this.price = price;
    }
}


执行结果
在这里插入图片描述

如果构造器当中有相同的语句,我们可以把这些语句放在代码块中,不然会显得代码冗余
这样子不管我们调用哪一个构造器,创建对象,都会先调用代码块的内容
代码块调用顺序优先于构造器

2.代码块使用的注意事项

代码块先执行,构造器再执行
在这里插入图片描述

package  codeblock;

 
public class code2 {
    public static void main(String[] args) {
        new A();
    }
}
class A{
    static {
        System.out.println("静态代码块A执行");
    }
    {
        System.out.println("代码块A执行");
    }
    public A(){
        System.out.println("构造器A执行");
    }

}

执行结果:

静态代码块A执行
代码块A执行
构造器A执行
package com.zyh.codeblock;

/**
 * @author zengyihong
 * @create 2022--02--20 9:22
 */
public class code2 {
    public static void main(String[] args) {
        //new A();
        new B();
    }
}
class A{
    static {
        System.out.println("静态代码块A执行");
    }
    {
        System.out.println("代码块A执行");
    }
    public A(){
        System.out.println("构造器A执行");
    }

}

class B extends A{

    static {
        System.out.println("静态代码块B执行");
    }
    {
        System.out.println("代码块B执行");
    }


}

执行结果:
在这里插入图片描述
静态代码块随着类的加载而加载,并且只会加载一次,代码块随着对象的创建,每创建一次,都会调用一次

package  codeblock;

 
public class code2 {
    public static void main(String[] args) {
        //new A();
        new B();
        System.out.println("-------------------");
        new B();
    }
}
class A{
    static {
        System.out.println("静态代码块A执行");
    }
    {
        System.out.println("代码块A执行");
    }
    public A(){
        System.out.println("构造器A执行");
    }

}

class B extends A{

    static {
        System.out.println("静态代码块B执行");
    }
    {
        System.out.println("代码块B执行");
    }


}

在这里插入图片描述
在这里插入图片描述

package codeblock;

public class code3 {
  public static void main(String[] args) {

    D d = new D();// (1) A 静态代码块 01 (2) getN1 被调用...(3)A 普通代码块 01(4)getN2 被调用...(5)A()  构造器被调

  }
}

class D {
   //普通代码块

 {
  System.out.println("A 普通代码块 01");
 }

 private int n2 = getN2();//普通属性的初始化


 private static    int n1 = getN1();
 static { //静态代码块
  System.out.println("D 静态代码块 01");
 }

 //静态属性的初始化

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

 public int getN2() { //普通方法/非静态方法
  System.out.println("getN2 被调用...");
  return 200;
 }
 //无参构造器
 public D() {
  System.out.println("A()  构造器被调用");
 }
}

在这里插入图片描述
在这里插入图片描述

package codeblock;

public class CodeBlockDetail03 {
    public static void main(String[] args) {
        //(1)AAA 的普通代码块(2)AAA()  构造器被调用(3)BBB 的普通代码块(4)BBB()  构造器被调用 }
        new BBB();
    }
}
    class AAA { //父类 Object
        {
            System.out.println("AAA 的普通代码块");
        }

        public AAA() {
//(1)super()
//(2)调用本类的普通代码块
            System.out.println("AAA()  构造器被调用....");
        }


    }

   class BBB extends AAA {
        {
            System.out.println("BBB 的普通代码块...");
        }

        public BBB() {
//(1)super()
//(2)调用本类的普通代码块
            System.out.println("BBB()  构造器被调用....");
        }
    }

在这里插入图片描述
在这里插入图片描述

静态代码块只能调用静态属性,静态方法,而普通代码块可以调用任何成员

注:本文是学习韩顺平老师的课程所写

相关文章
|
6月前
|
人工智能 安全 算法
算力与安全:当千问大模型点亮超算互联网的“普罗米修斯之火”
**技术革命的新纪元:从“火种”到“燎原”** 2025年,中国国家超算互联网平台接入阿里巴巴“千问QwQ-32B”大模型,标志着算力资源整合迈入新阶段。用户可免费调用百万级Token的计算资源,将智能播撒至各领域。然而,这也带来了网络安全新挑战,如数据泄露、虚假信息传播和智能体失控等风险。 **算力与安全的辩证:一场永无止境的“矛与盾”博弈** 国家超算互联网通过连接20余家超算中心,汇聚6500余款算力商品,提升效率的同时也扩散了安全风险。基座模型幻觉、知识库渗透和智能体失控等问题凸显了安全防护的重要性,需构建全链路防护体系。
|
4月前
|
安全 前端开发 Linux
Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台
Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台
149 3
Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台
|
5月前
|
Shell 开发者 Docker
Python文件打包:一站式指南
本文深入探讨Python文件打包的各种方法,从基础的zip和tar工具到高级的setuptools、PyInstaller、cx_Freeze等,涵盖Docker镜像、虚拟环境及自包含可执行文件的打包方式。通过示例代码与详细解析,帮助开发者根据项目需求选择合适的打包方案,提升代码分发与部署效率。内容全面,适合各水平读者学习参考。
382 7
|
数据采集 网络协议 测试技术
使用Go Validator在Go应用中有效验证数据
使用Go Validator在Go应用中有效验证数据
EMQ
|
存储 JSON 数据库
MQTTX 1.10.0 发布:CLI高级文件管理与配置
在本次更新中,CLI 版本在文件管理和配置功能方面进行了显著增强。主要更新包括:支持从文件中读取和写入消息、高级配置选项、文本输出模式、以及改进的日志记录。此外,桌面版本现在支持数据库重建,以防止文件损坏引起的问题,并且能更好地处理大数据的展示。这些更新希望为所有 MQTTX 用户提供更加强大和用户友好的体验。
EMQ
766 86
MQTTX 1.10.0 发布:CLI高级文件管理与配置
|
Java iOS开发 MacOS
8 种 Java- 内存溢出之四 -Metaspace
8 种 Java- 内存溢出之四 -Metaspace
|
10月前
|
存储 安全 搜索推荐
hyperf-throttle-requests,一个超牛的 PHP 限流神器
`hyperf-throttle-requests` 是专为 Hyperf 框架设计的请求频率限流库,适用于分布式系统和微服务架构,能有效防止恶意攻击和流量高峰对后端服务的影响。通过限制用户在一定时间内的请求次数,确保服务的稳定性和可用性。该库支持注解、助手函数及直接调用三种使用方式,并提供了灵活的配置选项,如存储驱动、最大请求次数等。最新版已兼容 Hyperf 3.1 版本,安装简便,配置灵活,是保护后端服务的理想选择。
154 3
|
12月前
|
机器学习/深度学习 数据可视化 搜索推荐
使用Python实现深度学习模型:智能睡眠监测与分析
使用Python实现深度学习模型:智能睡眠监测与分析
1288 2
|
12月前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
165 4
|
SQL 安全 Java
网络安全面试题及经验分享(第一期)
本文原文来自:i春秋,转载以供自己复习使用,下面题目都是来自2023年面试题目和答案解析,题目是学员们真实的面试经历分享,具有很高的参考价值。

热门文章

最新文章