Java中的static

时间:2020-01-09 10:34:51  来源:igfitidea点击:

Java中的static关键字用于创建与类而不是与类的任何对象关联的变量和方法。

Java中的静态

通常,当我们创建一个类时,它充当该类对象的蓝图。只有在使用new运算符创建类的对象时,字段和方法的存储空间才真正可用,并且可以使用该对象调用方法。该类的每个对象都有其自己的实例变量副本。

但是我们可能会遇到这样的情况,无论创建多少个对象(例如在声明常量时),都只想要变量的单个副本。我们可能还需要一个与对象无关的方法,并且无需创建任何类的对象就可以调用该方法。这两件事都可以通过在Java中使用static关键字来完成。

如果在Java中将变量或者方法标记为静态,则该变量或者方法不与该类的任何对象关联,而是存在于类级别,则可以访问该变量或者方法而无需创建该类的任何对象。 Java中的静态main方法就是具有这种要求的示例,该示例中我们应该能够在不创建任何对象的情况下调用方法。

Java中的static关键字可与下面内容一起使用

  • 变数

  • 方法

  • 静态块

  • 嵌套(内部)类

Java中的静态变量

如果要具有所有对象共有的变量,可以将其标记为静态。

举例来说-static int x = 10;

具有静态修饰符的字段与类关联,而不与任何对象关联,此类字段称为静态字段或者类变量。静态变量直接使用类名称访问,不需要该类的对象。

ClassName.static_var;

虽然我们也可以使用对象引用来引用静态字段,例如

obj.static_var

但是不建议这样做,因为它并不能清楚地表明它们是类变量。

由于静态变量由类的所有实例共享,因此静态变量作为固定位置存储在内存中,该内存是JVM中的方法区域。

静态变量用法

在Java中,带有字段的static关键字通常与final关键字结合使用,以定义常量。将字段标记为静态可确保只有一个副本,将其标记为最终副本可确保无法更改值。

public static final String PATH = "/usr/bin";
public static final int DAYS_PAID = 22;

Java中的静态方法

静态方法也与该类相关联,而不与该类的实例相关联。

静态方法应使用类名来调用,而无需创建类的实例。例如

ClassName.static_method(args);

尽管我们也可以使用此处给出的对象引用来引用静态方法

obj.static_method(args)

但这是不鼓励的,因为并不能清楚地表明它们是类方法。

静态方法访问限制

  • 静态方法可以直接访问静态方法和静态字段。

  • 静态方法不能直接访问实例变量或者实例方法,在这种情况下需要对象引用。

  • 静态方法不能使用this关键字,因为静态方法不与任何实例关联。

  • super关键字不能在静态上下文中使用。

public class Test {
  public static void main(String[] args) { 
    staticMethod(); // ok
    nonStaticMethod(); // not permitted
  }
  // static method
  static void staticMethod(){
    System.out.println("In static method.");
  }
  // non static method
  void nonStaticMethod(){
    System.out.println("In non-static method.");
  }
}

静态方法的使用

静态方法的常见用途之一是创建静态实用程序方法。由于实用程序方法通常具有诸如排序,格式化,数据包装之类并非应用程序核心的逻辑,因此无需通过对象调用这些实用程序方法。

Java中的静态块

静态块是在类中包含的一组封闭语句,仅在加载该类时执行一次。甚至在执行main方法之前就执行了静态块。

静态块使用

静态块通常用于初始化Java中的静态变量和静态空白最终变量。

静态块示例

public class Test {
  // static blank final variable
  static final int x;
  static int y;
  static{
    System.out.println("In static block");
    y = staticMethod(2);
    x = 5;
  }
  public static void main(String[] args) { 
    System.out.println("In main method");
    System.out.println("x = " + x);
    System.out.println("y = " + y);
  }
	 
  static int staticMethod(int i){
    return i * 5;
  }
}

输出:

In static block
In main method
x = 5
y = 10

我们可以在此处看到在main方法之前执行了静态块。

Java中的静态内部类

嵌套的(内部)类也可以标记为静态类,请注意,顶级类不能是静态的。

静态嵌套类使用封闭的类名称Top_class.Nested_class进行访问

静态嵌套类不能直接引用其封闭类中定义的实例变量或者方法,它只能通过对象引用来使用它们。

静态嵌套类Java示例

public class Test {
  int num1 = 7;
  public static class NestedClass{
    Test obj = new Test();
    private int num2 = 5;
    void display(){
      System.out.println("Value is "+ obj.num1 * num2);
    }
  }
  public static void main(String[] args) {
    Test.NestedClass nestedObj = new Test.NestedClass();
    nestedObj.display();
  }
}

输出:

Value is 35