Java面向对象 类的成员之代码块的详解

简介: Java面向对象 类的成员之代码块的详解

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

  1. 代码块如果有修饰的话只能用static修饰
  2. 分类:静态代码块 VS 非静态代码块
  3. 静态代码块:
//静态代码块,由一对大括号组成
static{ 
  }

4.1.内部可以有输出语句。

4.2.随着类的加载而执行,而且只执行一次。

4.3.作用:初始化类的信息。

4.4.如果一个类中定义了多个代码块,则按照声明代码块的先后顺序执行。

4.5.静态代码块的执行要优先于非静态代码块的执行。

4.6.静态代码块内只能调用静态的属性,方法,不能调用非静态的结构。

5.非静态代码块

{
}

5.1.内部可以有输出语句。

5.2.随着对象的创建而执行。

5.3.每创建一个对象就执行一次非静态代码块。

5.4.作用:可以在创建对象时,对对象的属性进行初始化。

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

5.6.非静态代码块中,可以调用静态的属性,方法也可以调用非静态的属性,方法。

代码块的执行顺序优先于构造器。

重点:类什么时候被加载:

  1. 创建对象实例时(new)
  2. 创建子类对象实例,父类也会被加载
  3. 使用类中的静态成员时(静态属性,静态方法)

另:对属性可以赋值的位置:

  1. 默认初始化
  2. 显示初始化
  3. 构造器中初始化
  4. 有了对象以后,可以通过“对象.属性”或“对象.方法”进行初始化赋值
  5. 在代码块中赋值

执行的先后顺序:1 - 2/5 - 3 - 4

重点:

案例代码如下:

public class CodeBlockDetail04 {
    public static void main(String[] args) {
        //1.先进行类的加载
        //1.1 先加载父类 A02 再加载B02
        //2.创建对象
        //2.从子类的构造器开始
        B02 b02 = new B02();
    }
}
class A02 {
    private static int n1 = getVal01();
    static {
        System.out.println("A02的静态代码块");//(2)
    }
    {
        System.out.println("A02的普通代码块"); //(5)
    }
    public int n3 = getVal02(); //普通属性的初始化
    private int getVal02() {
        System.out.println("getVal02"); //(6)
        return 10;
    }
    private static int getVal01() {
        System.out.println("getVal01");//(1)
        return 10;
    }
    public A02() {
        //隐藏
        //super()
        //普通代码块
        System.out.println("A02的构造器"); //(7)
    }
}
class B02 extends A02 {
    private static int n3 = getVal03();
    static {
        System.out.println("BO2的静态代码块");//(4)
    }
    public int n5 = getVal04();
    {
        System.out.println("B02的普通代码块");//(9)
    }
    private int getVal04() {
        System.out.println("getVal04"); //(8)
        return 10;
    }
    private static int getVal03() {
        System.out.println("getVal03");//(3)
        return 10;
    }
    public B02() {
        //隐藏
        //super()
        //普通代码块
        System.out.println("B02的构造器"); //(10)
    }
}

输出结果如下:

getVal01
A02的静态代码块
getVal03
BO2的静态代码块
A02的普通代码块
getVal02
A02的构造器
getVal04
B02的普通代码块
B02的构造器


目录
相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
166 57
|
22天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
1月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
27 1
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
71 8
|
2月前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
34 3
|
2月前
|
JavaScript 前端开发 Java
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。如果你从我的文章中受益,欢迎关注我,我将持续更新更多优质内容。你的支持是我前进的动力!🎉🎉🎉
28 0
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
|
Java 程序员 Go
Java基础6:代码块与代码加载顺序
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/80069472 这位大侠,这是我的公众号:程序员江湖。
|
9天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
50 17
|
20天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
5天前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题