Java static

博客介绍了Java中被static修饰的变量和方法的特性。static属于类,可修饰成员变量和方法,被修饰的属性内存中仅一份。静态方法不能用非静态成员,非静态方法可访问静态成员。static代码块在类加载时按顺序初始化且只执行一次,还能优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:https://www.cnblogs.com/dolphin0520/p/3799052.html

被static修饰的变量和方法不依赖对象来进行访问,只要类被加载了,就可通过类名直接访问。
static属于类,可修饰类的成员变量,类方法。
static修饰的属性在内存中只有一份,而其它属性则是每个对象。

静态方法

静态方法不能使用非静态方法和非静态成员变量。因为非静态方法和非静态成员变量依赖具体的对象。
但是非静态方法可以访问静态方法和静态成员变量。

静态变量

静态变量被所有对象共享,在内存中只有一个副本,而且它仅在类初次加载时初始化。而非静态变量是对象拥有的,在对象创建的时候被初始化,各个对象存在独有的副本且互不影响。

static代码块

static代码块可放在类中的任何位置,每个类可有多个static代码快。类加载时按照static的顺序初始化每个static代码块,且只会执行一次。
static可以优化性能。

class Person{
    private Date birthDate;
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
    // startDate, endDate是固定值,每次调用该方法都会创建该对象,浪费空间性能。
        Date startDate = Date.valueOf("1946"); 
        Date endDate = Date.valueOf("1964");
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}
class Person{
    private Date birthDate;
    private static Date startDate,endDate;
    static{
        startDate = Date.valueOf("1946");
        endDate = Date.valueOf("1964");
    }
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}
内容概要:本文档详细介绍了一个基于MATLAB实现的跨尺度注意力机制(CSA)结合Transformer编码器的多变量时间序列预测项目。项目旨在精准捕捉多尺度时间序列特征,提升多变量时间序列的预测性能,降低模型计算复杂度与训练时间,增强模型的解释性和可视化能力。通过跨尺度注意力机制,模型可以同时捕获局部细节和全局趋势,显著提升预测精度和泛化能力。文档还探讨了项目面临的挑战,如多尺度特征融合、多变量复杂依赖关系、计算资源瓶颈等问题,并提出了相应的解决方案。此外,项目模型架构包括跨尺度注意力机制模块、Transformer编码器层和输出预测层,文档最后提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,尤其是熟悉MATLAB和深度学习的科研人员、工程师和研究生。 使用场景及目标:①需要处理多变量、多尺度时间序列数据的研究和应用场景,如金融市场分析、气象预测、工业设备监控、交通流量预测等;②希望深入了解跨尺度注意力机制和Transformer编码器在时间序列预测中的应用;③希望通过MATLAB实现高效的多变量时间序列预测模型,提升预测精度和模型解释性。 其他说明:此项目不仅提供了一种新的技术路径来处理复杂的时间序列数据,还推动了多领域多变量时间序列应用的创新。文档中的代码示例和详细的模型描述有助于读者快速理解和复现该项目,促进学术和技术交流。建议读者在实践中结合自己的数据集进行调试和优化,以达到最佳的预测效果。
### Java中`static`关键字详解 在Java中,`static`关键字是一个非常重要的概念,它用于修饰类的成员(变量和方法),表示这些成员属于类本身而不是类的实例。这意味着无论创建多少个类的对象,静态成员都只有一份拷贝,并且可以通过类名直接访问,而不需要创建对象。 #### 1. 静态变量(Static Variables) 静态变量也被称为类变量,它们不属于任何一个对象,而是属于整个类。所有该类的对象共享同一个静态变量。静态变量可以在声明时初始化,也可以在静态代码块中初始化。 ```java public class Person { public static int age = 20; } ``` 上述代码中定义了一个名为`age`的静态变量,可以通过类名直接访问: ```java System.out.println(Person.age); // 输出20 ``` 需要注意的是,`static`关键字不会影响变量或方法的作用域。访问权限仍然由`private`、`public`、`protected`以及默认包访问权限决定[^1]。 #### 2. 静态方法(Static Methods) 静态方法可以直接通过类名调用,无需创建类的实例。静态方法只能访问静态成员,不能直接访问非静态成员,因为非静态成员依赖于具体的对象实例。 ```java public class MathUtils { public static int add(int a, int b) { return a + b; } } ``` 调用静态方法的方式如下: ```java int result = MathUtils.add(5, 3); // 结果为8 ``` 此外,静态方法内部无法使用`this`关键字来引用当前对象,因为静态方法并不与任何特定的对象关联[^1]。 #### 3. 静态代码块(Static Code Blocks) 静态代码块是在类加载时执行的一段代码,通常用来初始化静态变量。它可以包含任意多条语句,并且可以多次出现,但它们会在程序运行期间仅被执行一次。 ```java public class StaticBlockExample { static { System.out.println("这是静态代码块"); } } ``` 当首次加载`StaticBlockExample`类时,会打印出“这是静态代码块”。 #### 4. 静态导入(Static Import) 从Java 5开始,支持静态导入功能,允许直接导入某个类的所有静态成员或者指定的静态成员,从而简化了对静态成员的调用。 ```java import static java.lang.Math.*; ``` 之后就可以直接使用数学函数而不必加上`Math.`前缀: ```java double sqrtValue = sqrt(16); // 直接调用sqrt方法 ``` #### 5. 单例模式中的应用 `static`关键字常被用来实现单例设计模式,确保一个类只有一个实例存在,并提供全局访问点。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 在这个例子中,`instance`是静态变量,`getInstance()`是静态方法,共同保证了单一实例的存在。 #### 6. JVM与类加载 `static`关键字还涉及到JVM的工作机制,特别是类加载过程。类的加载分为三个阶段:加载、链接和初始化。其中,初始化阶段就是执行类构造器`<clinit>`的过程,这个过程包含了静态变量赋值动作和静态代码块的执行[^3]。 #### 7. 并发问题 由于静态成员在整个应用程序生命周期内都是可访问的,所以在多线程环境下需要特别小心处理同步问题。如果多个线程同时修改同一个静态变量,可能会导致数据不一致的问题,因此可能需要采取适当的锁定策略来保护共享资源。 #### 8. 设计考量 尽管`static`提供了便利性,但也有人认为过度使用`static`可能是反设计模式的做法,因为它可能导致代码难以测试和维护,尤其是对于那些具有副作用的静态方法来说更是如此。此外,静态成员使得单元测试变得更加困难,因为它们不容易被模拟(mock)或替换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值