Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • Java入门基础

    • 计算机常识

    • Java语言概述

    • 基本语法

    • 数组

    • 面向对象

      • 面向对象
      • 类和对象
      • 类的成员-属性
      • 类的成员-方法
      • 类的成员-构造器
      • 面向对象特性-封装
      • this关键字
      • package关键字
      • import关键字
      • 面向对象特征-继承
      • 方法的重写
      • 访问权限修饰符
      • super关键字
      • 子类对象实例化的全过程
      • 面向对象特征-多态
      • 强制类型转换
      • Object类
      • 包装类
      • static关键字
      • 单例设计模式
      • main方法
      • 类的成员-代码块
        • 类的成员
        • 代码块
        • 程序中成员变量赋值的执行顺序
        • 总结
      • final关键字
      • 抽象类与抽象方法
      • 接口
      • 类的成员-内部类
    • 异常处理

  • Java核心基础

  • 设计模式

  • Web开发

  • SpringBoot

  • 微服务

  • Elasticsearch

  • 运维

  • 后端
  • Java入门基础
  • 面向对象
SaulJWu
2020-12-15

类的成员-代码块

# 类的成员

Java的基本单位是类class,Java成员即类中的成员,包括以下五个部分:

  • 属性
  • 方法
  • 构造器
  • 代码块/初始化块
  • 内部类

# 代码块

什么是代码块?

就是一对大括号包起来的,就是代码块

代码块(或初始化块)的作用

对Java类或对象进行初始化

代码块(或初始化块)的分类:

一个类中代码块若有修饰符,则只能被static修饰,称为静态代码块(staticblock),没有使用static修饰的,为非静态代码块。

代码块静态和非静态有些细节需要了解,不难理解:

static代码块

  • 通常用于初始化static的属性,随着对象的加载而执行,而且只执行一次
class Person{
    private int age;
    public static String desc = "我是一个人……";
    
    //代码块
    static{
        total = 100;
        System.out.println("初始化")
    }
    
    ……//其他属性或者声明
}
1
2
3
4
5
6
7
8
9
10
11
12
String desc1 = Person.desc;
String desc2 = Person.desc;
String desc3 = Person.desc;
1
2
3

发现只输出一次初始化。

  • 如果一个类中定义多个静态代码块,则按照声明的先后顺序执行。
  • 静态代码块的执行要优先于非静态代码块

非静态代码块

  • 每创建一个对象,就执行一次静态代码块
class Person{
    private int age;
    public static String desc = "我是一个人……";
    
    static{
        total = 100;
        System.out.println("初始化")
    }
    
    ……//其他属性或者声明
}
1
2
3
4
5
6
7
8
9
10
11
new Person();
new Person();
new Person();
1
2
3

你会发现输出了三次初始化。

  • 如果一个类中定义多个非静态代码块,则按照声明的先后顺序执行。

代码块调用方法

无论是静态还是静态,都可以在代码块内调用方法,不过静态代码块内只能调用静态的属性或方法,而非静态代码块内可以调用任意的属性或方法。

# 程序中成员变量赋值的执行顺序

回顾:对属性可以赋值的位置(包含顺序)

  1. 默认初始化

  2. 显式初始化

  3. 构造器中初始化/ 5. 在代码块中赋值

  4. 通过对象属性或方法赋值

  5. 声明成员变量的默认初始化

  6. 显式初始化、多个初始化块依次被执行(同级别下按先后顺序执行)

  7. 构造器再对成员进行初始化操作

  8. 通过”对象.属性”或”对象.方法”的方式,可多次给属性赋值6.3 类的成员之四:代码块

总结成一句话是:由父从子,静态先行。

# 总结

  1. 代码块的作用:来初始化块、对象
  2. 代码块如果有修饰的话,只能用static
  3. 分类:静态代码块vs非静态代码块
  4. 静态代码块
    1. 内部可以由输出语句
    2. 随着类的加载而执行,而且只执行一次
    3. 作用:初始化类的属性
    4. 如果一个类中定义多个静态代码块,则按照声明的先后顺序执行。
    5. 静态代码块的执行要优先于非静态代码块
    6. 静态代码块内只能调用静态的属性、方法,不能调用非静态的结构
  5. 非静态代码块
    1. 内部可以有输出语句
    2. 随着对象的创建而执行
    3. 每创建一个对象,就执行一次静态代码块
    4. 作用:可以在创建对象时,对对象的属性进行初始化
    5. 如果一个类中定义多个非静态代码块,则按照声明的先后顺序执行。
    6. 非静态代码块内可以调用静态的属性、方法或者非静态的属性、方法。

代码块其实使用频率不高,但是有些源码中使用,所需还是需要了解的,知道代码执行先后顺序,对读源码有用。

帮我改善此页面 (opens new window)
#代码块#初始化块
上次更新: 2020/12/18, 12:50:58
main方法
final关键字

← main方法 final关键字→

最近更新
01
zabbix学习笔记二
02-28
02
zabbix学习笔记一
02-10
03
Linux访问不了github
12-08
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式