`

Java类中的静态变量

阅读更多
Java类中的静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的,有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源,可以将类中的一些变量声明为静态变量,通过下面的例子,你可以发现合理应用静态变量带来的好处:
public class WeekA{   
  
       static class Data {    
  
             private int week;   
             private String name;   
             Data(int i, String s) {   
                   week= i;   
                   name = s;   
             }   
       }   
  
       Data weeks[] = {   
             new Data(1, "Monday"),   
             new Data(2, "Tuesay"),   
             new Data(3, "Wednesday"),   
             new Data(4, "Thursday"),   
             new Data(5, "Friday"),   
             new Data(6, "Saturday"),   
             new Data(7, "Sunday")   
       };   
  
       public static void main(String args[]) {   
  
             final int N = 10000;   
             WeekA weekinstance;   
             for (int i = 1; i <= N; i++){   
                   weekinstance = new WeekA ();   
             }   
  
       }   
  
}  

public class WeekA{

       static class Data { 

             private int week;
             private String name;
             Data(int i, String s) {
                   week= i;
                   name = s;
             }
       }

       Data weeks[] = {
             new Data(1, "Monday"),
             new Data(2, "Tuesay"),
             new Data(3, "Wednesday"),
             new Data(4, "Thursday"),
             new Data(5, "Friday"),
             new Data(6, "Saturday"),
             new Data(7, "Sunday")
       };

       public static void main(String args[]) {

             final int N = 10000;
             WeekA weekinstance;
             for (int i = 1; i <= N; i++){
                   weekinstance = new WeekA ();
             }

       }

}


在上面这段代码中,没有将Data weeks声明为静态变量,因此当创建WeekA对象时将会得到10 000个weeks对象的副本,这些对象被保存在内存中,但是weeks对象中的数据却从来没有被更改过,而且十分稳定。因此,如果能使所有对象共享该数据对象是个不错的解决办法,请看下面的代码:
public class WeekB{   
  
      static class Data {    
  
             private int week;   
             private String name;   
             Data(int i, String s) {   
                   week= i;   
                   name = s;   
            }   
  
      }   
  
      static Data weeks[] = {   
             new Data(1, "Monday"),   
             new Data(2, "Tuesay"),   
             new Data(3, "Wednesday"),   
             new Data(4, "Thursday"),   
             new Data(5, "Friday"),   
             new Data(6, "Saturday"),   
             new Data(7, "Sunday")   
      };   
  
      public static void main(String args[]) {   
  
             final int N = 10000;   
             WeekB weekinstance;   
             for (int i = 1; i <= N; i++){   
                   weekinstance = new WeekB ();   
             }   
     }   
  
}      

public class WeekB{

      static class Data { 

             private int week;
             private String name;
             Data(int i, String s) {
                   week= i;
                   name = s;
            }

      }

      static Data weeks[] = {
             new Data(1, "Monday"),
             new Data(2, "Tuesay"),
             new Data(3, "Wednesday"),
             new Data(4, "Thursday"),
             new Data(5, "Friday"),
             new Data(6, "Saturday"),
             new Data(7, "Sunday")
      };

      public static void main(String args[]) {

             final int N = 10000;
             WeekB weekinstance;
             for (int i = 1; i <= N; i++){
                   weekinstance = new WeekB ();
             }
     }

}    

请注意在类WeekB中,在Data weeks[]之前添加了static关键字,将该对象变量声明为静态的,因此当你创建10 000个WeekB对象时系统中只保存着该对象的一份拷贝,而且该类的所有对象实例共享这份拷贝,这无疑节约了大量的不必要的内存开销,同时实现了要完成的系统功能。

那么是不是我们应该尽量地多使用静态变量呢?其实不是这样的,因为静态变量生命周期较长,而且不易被系统回收,因此如果不能合理地使用静态变量,就会适得其反,造成大量的内存浪费,所谓过犹不及。因此,建议在具备下列全部条件的情况下,尽量使用静态变量:

(1)变量所包含的对象体积较大,占用内存较多。

(2)变量所包含的对象生命周期较长。

(3)变量所包含的对象数据稳定。

(4)该类的对象实例有对该变量所包含的对象的共享需求。

如果变量不具备上述特点建议你不要轻易地使用静态变量,以免弄巧成拙。
分享到:
评论

相关推荐

    Java中的静态变量静态方法静态块与静态类.docx

    Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...

    java 利用反射获取内部类静态成员变量的值操作.docx

    本文将详细介绍如何使用Java反射技术来获取内部类中的静态成员变量的值。 #### 二、背景知识 在深入探讨之前,我们需要了解几个基本概念: 1. **内部类**:内部类是一种特殊的类,定义在另一个类(外部类)的内部。...

    java中静态与非静态的变量定义与使用

    在上述代码中,`Table` 类和 `Cupboard` 类中的 `b1`、`b2`、`b4` 和 `b5` 就是静态变量的例子。它们在类加载时被初始化,并且打印出相应的构造器消息。 非静态变量,也称为实例变量,是属于类的每个实例的。每次...

    static静态变量使用@Value注入方式.md

    在Java中,可以通过类名直接访问静态变量而无需创建类的实例。例如: ```java public class MyClass { public static String myVar = "Hello World"; } // 访问静态变量 System.out.println(MyClass.myVar); ``` ...

    Java类加载器:静态变量初始化.docx

    在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...

    java类变量初始化顺序

    详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。

    Java中static静态变量.pdf

    在Java编程语言中,`static`关键字是用来声明静态变量和静态方法的,这些成员属于类本身,而不属于类的任何实例。静态变量,也被称为类变量,是存储在内存的类区域,而实例变量则是存储在堆内存中,每个对象实例都有...

    Java中的静态变量.txt

    Java中的静态变量

    静态变量的导入以及集合的运用

    在Java中,可以通过`import static`语句来直接导入一个类中的静态成员(包括静态变量和静态方法)。这种方式可以避免重复输入类名,使得代码更加简洁易读。例如,在给定的代码片段中: ```java import static java....

    Java成员变量局部变量静态变量成员方法全局方法等概念的区

    以下是关于Java成员变量、局部变量、静态变量以及成员方法和全局方法的基本概念和区别的详细阐述。 1. 成员变量(Member Variables): 成员变量是类的一部分,它们定义了对象的状态。它们可以是实例变量(非静态...

    java之中的静态变量与静态方法的继承与覆盖问题.doc

    在Java编程语言中,静态变量(也称为类变量)和静态方法(也称为类方法)是由`static`关键字修饰的成员变量和成员方法。它们的特点在于不依赖于对象的存在,可以通过类名直接访问。 #### 静态变量的特点 - **共享...

    static 静态变量加载

    statilocal java 静态变量和静态块加载顺序,静态变量和同名静态变量块加载的顺序。

    springboot 使用yml配置文件给静态变量赋值教程

    在这个教程中,我们将学习如何使用`yml`配置文件为静态变量赋值,特别是针对像数据查询引擎连接工具类这样的场景。 首先,我们需要在`yml`配置文件中定义所需的参数。以`clickhouse`为例,我们会在`application.yml...

    python类和函数中使用静态变量的方法

    静态变量在其他面向对象的语言如Java或C#中比较常见,但在Python中,由于其动态特性的存在,实现静态变量的方式稍有不同。本篇文章将详细介绍在Python中如何在类和函数中使用静态变量,并通过三个示例来说明。 **...

    java-静态变量方法块

    在Java编程语言中,静态变量、静态方法、静态代码块以及非静态变量和非静态方法是核心概念,它们对于理解和编写Java程序至关重要。下面将详细解释这些概念,并通过实例程序来阐述它们的使用和内存管理。 首先,静态...

    静态变量与非静态变量获取配置文件application中变量值的区别.docx

    这是因为静态变量的赋值需要在类初始化时进行,而不是在实例化对象时进行。 为了解决这个问题,我们可以使用 setter 方法来赋值静态变量。例如: ```java @RestController @RequestMapping("/getvalue") public ...

    Java中私有静态变量的用途是什么.txt

    Java中私有静态变量的用途是什么

Global site tag (gtag.js) - Google Analytics