Java中的static
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