static是在Java中经常用到的一个关键字,被static修饰的变量和方法是独立于任何的实例存在的,因此它可以在任何对象创建之前访问,而无需引用任何对象。就比如下面Java中的main函数就是static修饰的,这是因为要在加载一个方法的时候首先加载main函数。

public class HelloWorld { 
    public static void main(String args[]) { 
        System.out.println("Hello World!"); 
    } 
}

这里也是静态方法中不能使用this和super关键字的原因

接下来,将从static的如下三种使用的角度来进行讲解。

1、static用于定义变量
2、static用于定义静态方法
3、static用于定义一个静态代码块

1、static用于定义变量
用static修饰的变量,可以不用实例化当前的类在别的类通过类名.变量名进行调用。在使用static定义变量的时候,不管再怎么使用,JVM只分配一次内存,因此对于内存空间来说是十分节省的。而如果是定义一个普通的变量,那么就需要每使用一次就实例化一个对象,也就重新分配一次内存空间,内存虽然比较浪费,但是各个变量相互不干扰,会更灵活一些。
所以不管是用还是不用静态,都要根据实际情况来分析。如果需要在别的类中使用该变量,为了方便变量的访问,那这时用静态会更方便一些。

2、static用于定义静态方法
前面说到,static修饰的变量和方法是独立的,且优先级是很高的,它是在类的级别而言的,因此,在静态方法中,不能使用this和super关键字。这是因为this和super是相对于方法而言的,this指向的是当前类已经创建的对象,super表示对父类对象的引用,相当于是静态方法和this、super没有在同一层面,因此就会出现找不到当前父类的错误。
另外,在静态方法中只能使用静态的对象和静态变量。原因是静态方法是在类的层面来说的,而在程序运行的时候,类是先于对象加载的,如果是普通变量和方法,那么是需要在对象创建的时候才为其分配内存空间,而这个时候类已经加载完毕,自然也就不能调用一个不存在的方法和变量。

3、static用于定义一个静态代码块
静态代码块用的并不是很多,由于静态块中的代码只执行一次,它一般用于静态初始化类。静态块中的代码只执行一次:第一次生成该类的对象或第一次访问该类的静态成员(即使从未生成该类的对象)。此外,静态块在构造函数之前执行

这里用一个简单的输出的例子来验证分析一下:

public class Test {

	static {
		System.out.println("Test中的静态块");
	}
	public Test(){
		System.out.println("Test中的构造函数");
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
//		A_Method A = new A_Method();
		C_Method C = new C_Method();
	}

}

class A_Method{
	static {
		System.out.println("A的静态块");
	}
	A_Method(){
		System.out.println("A的构造方法");
	}
	
}

class B_Method extends A_Method{
	static {
		System.out.println("B的静态块");
	}
	B_Method(){
		System.out.println("B的构造方法");
	}
	
}

class C_Method extends B_Method{
	static {
		System.out.println("C的静态块");
	}
	C_Method(){
		System.out.println("C的构造方法");
	}
}

运行结果

Java static的优缺点 java中static的基本用法_javascript


从这里可以看出来静态块总是先于构造方法执行的。

下面再增加一个A_Method实例。验证静态块是否只能被执行一次。

public class Test {

	static {
		System.out.println("Test中的静态块");
	}
	public Test(){
		System.out.println("Test中的构造函数");
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		A_Method A = new A_Method();
		C_Method C = new C_Method();
	}

}

class A_Method{
	static {
		System.out.println("A的静态块");
	}
	A_Method(){
		System.out.println("A的构造方法");
	}

}

class B_Method extends A_Method{
	static {
		System.out.println("B的静态块");
	}
	B_Method(){
		System.out.println("B的构造方法");
	}

}

class C_Method extends B_Method{
	static {
		System.out.println("C的静态块");
	}
	C_Method(){
		System.out.println("C的构造方法");
	}
}

运行结果

Java static的优缺点 java中static的基本用法_javascript_02

根据结果可以看到,运行结果只增加了“A的构造方法”这一句,而没有出现新增加的“A的静态块”, 所以验证了静态块在只能执行一次。
.
.
.
欢迎交流和指正