Java static关键字

java中的static关键字可以应用于变量、方法、块、导入和内部类。

on  It Road.com

静态导入语句

正常的导入声明从包中导入类,因此它们可以在没有包引用的情况下使用。
同样,静态导入声明从类中导入静态成员,并允许在没有类引用的情况下使用它们。

静态导入语句也有两种形式:单静态导入和静态导入按需。
单静态导入声明从类型中导入一个静态成员。
按需静态导入声明导入类型的所有静态成员。

//Single-static-import declaration:

import static <<package name>>.<<type name>>.<<static member name>>;

//Static-import-on-demand declaration:

import static <<package name>>.<<type name>>.*;

例如,System.out

// 静态导入语句
import static java.lang.System.out;
public class JavaStaticExample 
{
	public static void main(String[] args) 
	{
		DataObject.staticVar = 100;	
		out.println(DataObject.staticVar); 	// 静态导入语句示例
	}
}
class DataObject 
{
	public static Integer staticVar;	// 静态变量
}
Output:
100

Java 静态方法

要声明静态方法,请在方法声明中使用 static关键字。
静态方法语法是:

ACCESS_MODIFER static RETURN_TYPE METHOD_NAME;

例如,一个Integer类型的公共静态变量就是这样声明的。

public static Integer staticVar;
public static Integer getStaticVar(){
	return staticVar;
}
  • 我们只能访问静态方法中的静态变量。如果我们尝试访问任何非静态变量,将生成编译器错误并显示消息“无法对非静态字段 nonStaticVar 进行静态引用”。
  • 静态方法可以通过它的类引用访问,不需要创建类的实例。虽然我们也可以使用实例引用进行访问,但与通过类引用进行访问相比,它没有任何区别。
  • 静态方法也属于类级别范围。
public class JavaStaticExample 
{
	public static void main(String[] args) 
	{
		DataObject.staticVar = 100;	//Direct Access

		Integer value1 = DataObject.getStaticVar();	// 通过类引用访问
		DataObject objOne = new DataObject();
		Integer value2 = objOne.getStaticVar();		// 通过实例引用访问

		System.out.println(value1);
		System.out.println(value2);
	}
}
class DataObject 
{
	public Integer nonStaticVar;
	public static Integer staticVar;	// 静态变量

	public static Integer getStaticVar(){
		return staticVar;
	}
}
Output:
100
100

Java 静态块

静态块是类初始化代码的一部分,用 static关键字软件包。

public class Main {

    // 静态初始化块
    static {
        System.out.println("Inside static initializer");
    }   
}

静态块在类加载到内存中时执行。
一个类可以有多个静态块,这些块将按照它们出现在类定义中的相同顺序执行。

import static java.lang.System.out;
class DataObject 
{
	public Integer nonStaticVar;
	public static Integer staticVar;	// 静态变量

	// 首先执行
	static {
		staticVar = 40;
		//nonStaticVar = 20;	//无法访问非静态成员
	}

	// 其次执行
	static {
		out.println(staticVar);
	}
}

输出:

40

Java 静态变量

要声明一个静态变量,请在变量声明中使用 static关键字。
静态变量语法是:

ACCESS_MODIFER static DATA_TYPE VARNAME;

例如,一个Integer类型的公共静态变量就是这样声明的。

public static Integer staticVar;

静态变量最重要的一点是它们属于类级别。
这意味着运行时变量只能有一个副本。

当我们在类定义中定义静态变量时,类的每个实例都可以访问该单个副本。
类的单独实例不会有自己的本地副本,就像非静态变量一样。

public class JavaStaticExample 
{
	public static void main(String[] args) 
	{
		DataObject objOne = new DataObject();
		objOne.staticVar = 10;
		objOne.nonStaticVar = 20;

		DataObject objTwo = new DataObject();

		System.out.println(objTwo.staticVar);		//10
		System.out.println(objTwo.nonStaticVar);	//null

		DataObject.staticVar = 100;	//Direct Access

		System.out.println(objOne.staticVar);		//100
		System.out.println(objTwo.staticVar);		//100
	}
}
class DataObject {
	public static Integer staticVar;
	public Integer nonStaticVar;
}

输出

10
null
100
100

请注意我们如何将值更改为 100,并且两个对象现在都可以看到更新后的值 100。

我们应该注意到的另一件事是我们如何能够使用类名访问静态变量,例如:DataObject.staticVar
我们不需要创建任何实例来访问 static变量。
它清楚地表明静态变量属于类作用域。

Java 静态类

在 Java 中,我们可以将静态类作为内部类。
就像其他静态成员一样,嵌套类属于类范围,因此可以在没有外部类对象的情况下访问内部静态类。

public class JavaStaticExample 
{
	public static void main(String[] args) 
	{
		// 静态内部类示例
		System.out.println( DataObject.StaticInnerClas.innerStaticVar );
	}
}
class DataObject 
{
	public Integer nonStaticVar;
	public static Integer staticVar;	// 静态变量

	static class StaticInnerClas {
		Integer innerNonStaticVar = 60;	
		static Integer innerStaticVar = 70;		// 内部类中的静态变量
	}
}

请注意,静态内部类不能访问外部类的非静态成员。
它只能访问外部类的静态成员。

public class JavaStaticExample 
{
	public static void main(String[] args) 
	{
		//Static inner class example
		DataObject.StaticInnerClas.accessOuterClass();
	}
}
class DataObject 
{
	public Integer nonStaticVar;
	public static Integer staticVar;	// 静态变量

	static {
		staticVar = 40;
		//nonStaticVar = 20;	// 无法访问非静态成员
	}
	public static Integer getStaticVar(){
		return staticVar;
	}

	static class StaticInnerClas 
	{	
		public static void accessOuterClass()
		{
			System.out.println(DataObject.staticVar);		// 外部类的静态变量
			System.out.println(DataObject.getStaticVar());	// 外部类的静态方法
		}
	}
}

输出:

40
日期:2020-09-17 00:09:58 来源:oir作者:oir