Java类中static{}的具体使用

 更新时间:2024年07月07日 15:12:58   作者:枫飘长安  
static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,本文主要介绍了Java类中static{}的具体使用,感兴趣的可以了解一下

一、static{} 基础调用

tips:static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法

示例

Test 类,目录结构 包为 package org.example;

class Test{  
    public static int X = 100;  
    public final static int Y = 200;  
    public Test(){  
        System.out.println("Test构造函数执行");  
    }  
    static{  
        System.out.println("static语句块执行");  
    }  
    public static void display(){  
        System.out.println("静态方法被执行");  
    }  
    public void display_1(){  
        System.out.println("实例方法被执行");  
    }  
}
package org.example;  
public class Main {  
    public static void main(String[] args) {  
        try{  
            Class.forName("org.example.Test");  // 这里面要写类的全名,在多模块项目中
            Class.forName("org.example.Test");  // 单模块项目中不需要写全类名
        }catch(ClassNotFoundException e){  
            e.printStackTrace();  
        }  
    }  
}

运行结果:

static语句块执行

可以看到 static 只执行了一次。

类加载四大含义

1:显示类加载,如 Class.forName() 调用
2:实例化一个类,如 Test t = new Test(); 实例
3:调用类静态方法,如 Test.display();4:调用类静态变量,如 System.out.println(Test.X)

注意以下两点

一、调用类静态常量时,是不会加载类的,即不会执行 static{} 语句块,(Java 虚拟机规定,当访问类的静态常量时,如果编译器可以计算出常量的值,则不会加载类,否则会加载类)

二、用Class.forName() 形式的时候,我们可以设定不要加载类,变为 Class.forName("org.example.Test",false,StaticBlockTest.class.getClassLoader())

二、static{} 执行顺序

一、当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;

二、先执行完static{} 语句块内容,才会执行调用语句;

public class TestStatic{
    public static void main(String args[]){
        System.out.println(5);
    }
    static{
        System.out.println(1);
    }
    static {
        System.out.println(2);
    }
    static {
        System.out.println(3);
    }
    static {
        System.out.println(4);
    }
}

运行结果:

1,2,3,4,5

三、当一个类中既有static{} 又有 static 变量的时候,同样遵循 先定义先执行 的原则

class Test{
	 public static int X=300;
	 static{
		System.out.println(X);
		X=200;
		System.out.println(X);
	}
}
public class StaticBlockTest{
	 public static void main(String args[]){
	  System.out.println(Test.X);
	 }
}

运行结果:

300
200
200

三、static 应用场景

1、静态变量

当成员变量声明为 static 时,它属于类级别,而非对象级别。也就是说,无论创建多少个对象,所有对象共享同一份静态变量副本,且在类加载时初始化,生命周期贯穿整个应用程序。

示例:

public class MyClass {
    public static int count = 0;
    // ...
}

在上面的例子中,每次创建 MyClass 的对象时,count 不会重新初始化,而是所有对象共用同一个 count 变量。

2、静态方法

静态方法也是属于类级别的,不需要通过对象实例就可以调用,不能访问非静态成员变量和方法(除非它们是通过传递的对象引用访问的)。

静态方法常用于工具类或者不需要涉及对象状态的操作,如数学计算、IO操作等。

示例:

public class MathUtils {
    public static int add(int a, int b) {
        return a + b;
    }
    // ...
}

上述 MathUtils 类中的 add 方法可以直接通过类名调用,如 MathUtils.add(1, 2)

3、静态

静态块在类加载时执行,且只执行一次,主要用于初始化静态变量。

示例:

public class MySingleton {
    private static MySingleton instance;
    static {
        instance = new MySingleton();
    }
    // ...
}

在上面的单例模式实现中,静态块用于初始化单例对象。

4、静态内部类

静态内部类不需要持有外部类的引用,它可以独立于外部类实例而存在,通常用于组织相关功能,降低耦合度。

示例:

public class OuterClass {
    public static class InnerClass {
        // ...
    }
}

在上面的例子中,InnerClass 可以直接通过 OuterClass.InnerClass 的形式创建实例,而不必依赖于 OuterClass 的实例。

到此这篇关于Java类中static{}的具体使用的文章就介绍到这了,更多相关Java static{}内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java设计模式之动态代理

    Java设计模式之动态代理

    今天小编就为大家分享一篇关于Java设计模式之动态代理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 项目依赖Springboot jar失败解决方案

    项目依赖Springboot jar失败解决方案

    这篇文章主要介绍了项目依赖Springboot jar失败解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 介绍Java的大数类(BigDecimal)和八种舍入模式

    介绍Java的大数类(BigDecimal)和八种舍入模式

    在实际应用中,需要对更大或者更小的数进行运算和处理。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。本文将介绍Java中的大数类BigDecimal及其八种舍入模式,有需要的可以参考借鉴。
    2016-08-08
  • Java8中的Stream流式操作教程之王者归来

    Java8中的Stream流式操作教程之王者归来

    这篇文章主要给大家介绍了关于Java8中Stream流式操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Mybatis以main方法形式调用dao层执行代码实例

    Mybatis以main方法形式调用dao层执行代码实例

    这篇文章主要介绍了Mybatis以main方法形式调用dao层执行代码实例,MyBatis 是一款优秀的持久层框架,MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,需要的朋友可以参考下
    2023-08-08
  • Java源码解析之详解ReentrantLock

    Java源码解析之详解ReentrantLock

    今天给大家带来的是关于Java并发的相关知识,文章围绕着ReentrantLock源码展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 解决rocketmq-client日志保存路径的问题

    解决rocketmq-client日志保存路径的问题

    这篇文章主要介绍了解决rocketmq-client日志保存路径的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java构造器的重载实现实例讲解

    java构造器的重载实现实例讲解

    在本篇文章里小编给大家整理的是一篇关于java构造器的重载实现实例讲解内容,有兴趣的朋友们可以学习下。
    2021-01-01
  • SpringBoot_Cache自定义使用SimpleCacheManager方式

    SpringBoot_Cache自定义使用SimpleCacheManager方式

    这篇文章主要介绍了SpringBoot_Cache自定义使用SimpleCacheManager方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java设计模式之策略模式(Strategy模式)介绍

    Java设计模式之策略模式(Strategy模式)介绍

    这篇文章主要介绍了Java设计模式之策略模式(Strategy模式)介绍,Strategy是属于设计模式中对象行为型模式,要是定义一系列的算法,这些算法一个个封装成单独的类,需要的朋友可以参考下
    2015-03-03

最新评论