Java 中的静态块

原文:https://www.studytonight.com/java/static-in-java.php

Static 是 Java 中的一个关键字,用来声明静态的东西。它可以用来创建变量、方法块或类。

静态变量或方法可以在没有类实例的情况下访问,因为它属于类。静态成员对于类的所有实例都是通用的,但是非静态成员对于类的每个实例都是不同的。让我们研究它如何与变量和方法一起工作。

静态变量

定义为类成员的静态变量可以在没有该类对象的情况下访问。静态变量是初始化一次在类的不同对象之间共享。具有静态变量的类的所有对象将具有相同的静态变量实例。

注:静态变量用于表示一个类的公共属性。它节省内存。

示例:

假设一家公司有 100 名员工。所有员工都有其唯一的姓名和员工 id,但公司名称将与所有 100 名员工相同。这里公司名称是共同财产。因此,如果创建一个类来存储员工详细信息,那么将 company_name 字段声明为静态的

下面我们有一个带有一个静态变量的简单类,参见示例。

     class Employee
{
    int eid;
    String name;
    static String company = "Studytonight";

    public void show()
    {
        System.out.println(eid + "-" + name + "-" + company);
    }

    public static void main( String[] args )
    {
        Employee se1 = new Employee();
        se1.eid = 104;
        se1.name = "Abhijit";
        se1.show();

        Employee se2 = new Employee();
        se2.eid = 108;
        se2.name = "ankit";
        se2.show();
    }

}

104-Abhijit-今晚学习 108-ankit-今晚学习

我们可以使用下图来理解它,下图显示了程序使用的不同内存区域,以及静态变量是如何在类的对象之间共享的。

static-block-flow

当我们有一个像这样的类变量,使用 static 关键字定义,那么这个变量只定义一次,并且被这个类的所有实例使用。因此,如果任何一个类实例修改了它,那么这个类的所有其他实例都会改变它。

静态变量与实例变量

下面是静态变量和实例变量之间的一些区别。实例变量是非静态变量,存储在堆中,只能通过对象访问。

| 静态变量 | 实例变量 | | 代表共同财产 | 表示唯一属性 | | 使用类名访问(也可以使用对象名访问) | 使用对象访问 | | 只分配一次内存 | 每次创建新对象时分配新内存 |

示例:静态变量与实例变量

我们举个例子,了解一下区别。

     public class Test
{
    static int x = 100;
    int y = 100;
    public void increment()
    {
        x++; y++;
    }
    public static void main( String[] args )
    {
        Test t1 = new Test();
        Test t2 = new Test();
        t1.increment();
        t2.increment();
        System.out.println(t2.y);
        System.out.println(Test.x);  //accessed without any instance of class.
    }
}

101 102

查看两个变量的值的差异。静态变量 x 显示了不同对象上 increment() 方法对其所做的更改。而实例变量 y 仅显示了该特定实例上 increment() 方法对其所做的更改。

Java 中的静态方法

方法也可以声明为静态的。静态方法不需要其类的实例来访问。main()方法是静态方法最常见的例子。main()方法被声明为静态的,因为它是在创建类的任何对象之前被调用的。

让我们举个例子

     class Test
{

  public static void square(int x)
  {  
    System.out.println(x*x);
  }

  public static void main (String[] arg)
  {
    square(8)   //static method square () is called without any instance of class.
  }
}

Sixty-four

Java 中的静态块

静态块用于初始化静态数据成员。静态块甚至在 main()方法之前就执行了。

当类加载到内存中时,它会执行。一个类可以有多个静态块,这些静态块将按照它们被编程的相同顺序执行。

例子

让我们看一个例子,其中我们声明了一个静态块来初始化静态变量。

     class ST_Employee
{
    int eid;
    String name;
    static String company_name;

    static {
      company_name ="StudyTonight";   //static block invoked before main() method
    }

    public void show()
    {
        System.out.println(eid+" "+name+" "+company_name);
    }
    public static void main( String[] args )
    {
      ST_Employee se1 = new ST_Employee();
      se1.eid = 104;
      se1.name = "Abhijit";
      se1.show();
    }

}

104 Abhijit 研究今晚

不能从静态上下文引用非静态(实例)变量。

当我们试图从像 main 方法这样的静态上下文中访问非静态变量时,java 编译器会抛出一条错误消息非静态变量不能从静态上下文中引用。这是因为非静态变量与类(对象)的实例相关,并且它们是在使用新运算符创建类的实例时创建的。因此,如果我们试图在没有任何实例的情况下访问非静态变量,编译器会抱怨,因为这些变量尚未创建,并且在创建实例并与之关联之前,它们不存在。

例子

让我们举一个从静态上下文访问非静态变量的例子。

     class Test
{
  int x;
  public static void main(String[] args)
  {
    x = 10;
  }
}

编译器错误:不能从静态上下文引用非静态变量计数

为什么 main()方法在 java 中是静态的?

因为静态方法可以在没有类的任何实例的情况下调用,并且在创建类的任何实例之前调用main()