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{}内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于maven搭建一个ssm的web项目的详细图文教程

    基于maven搭建一个ssm的web项目的详细图文教程

    这篇文章主要介绍了基于maven搭建一个ssm的web项目的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 使用Backoff策略提高HttpClient连接管理的效率

    使用Backoff策略提高HttpClient连接管理的效率

    这篇文章主要为大家介绍了Backoff策略提高HttpClient连接管理的效率使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • SpringBoot开发案例之配置Druid数据库连接池的示例

    SpringBoot开发案例之配置Druid数据库连接池的示例

    本篇文章主要介绍了SpringBoot开发案例之配置Druid数据库连接池的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 为什么说要慎用SpringBoot @ComponentScan

    为什么说要慎用SpringBoot @ComponentScan

    本文主要介绍了为什么说要慎用SpringBoot @ComponentScan,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Java中的适配器原理解析

    Java中的适配器原理解析

    这篇文章主要介绍了Java中的适配器原理解析,当实现接口时,为了使所用的类中只实现需要的方法,使代码更加简洁,可以定义一个抽象类实现接口,将所需要的方法定义为 抽象方法,然后让类继承此抽象方法即可,需要的朋友可以参考下
    2023-11-11
  • 使用OpenFeign实现服务调用的方法详解

    使用OpenFeign实现服务调用的方法详解

    OpenFeign是运行在客户端的声明式服务调用的框架,通过声明接口的方式来达到对服务的调用,本文就来和大家讲讲如何使用OpenFeign实现服务调用吧
    2023-06-06
  • 详解Java中wait和sleep的区别

    详解Java中wait和sleep的区别

    这篇文章主要介绍了Java中wait和sleep的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java时区转换实例代码解析

    Java时区转换实例代码解析

    这篇文章主要介绍了Java时区转换实例代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • idea设置@Author文件头注释的实现步骤

    idea设置@Author文件头注释的实现步骤

    本文主要介绍了idea设置@Author文件头注释的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • java动态代理详解

    java动态代理详解

    本文章要用很土的语言描述Java动态代理,力求更易被理解。Java是JDK5中新加的机制,大家都知道Spring是用Java的动态代理实现的,那这个动态代理是什么东东呢,首先他肯定是个代理,我们先讲代理,把代理弄明白了,动态代理就好说了
    2014-02-02

最新评论