Java static关键字(总结)
类的成员可以用static修饰符修饰而成为静态成员。静态成员不是对象范畴,而是类范畴。只要类被加载,其静态数据成员就会被分配内存并初始化,并且只分配一次。如果生成此类及其子类的对象,所有对象共享这块内存。
静态方法不能被非静态方法覆盖
构造方法不允许声明为 static 的
局部变量不能使用static修饰
静态数据成员的访问
public class Demo {
public static void main(String[] args) {
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
A a=new A();a.show();A.static_show();a.print(99);A.static_print(99);
B b=new B();b.show();B.static_show();b.print(99);B.static_print(99);
C c=new C();c.show();C.static_show();c.print(99);C.static_print(99);
}
}
class A{
static int i;//这是所要访问的静态数据成员
void show(){
System.out.println("i="+i);
System.out.println("i="+this.i);
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
static void static_show(){
System.out.println("i="+i);
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
void print(int i){
System.out.println("i="+this.i);
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
static void static_print(int i){
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
}
class B extends A{
void show(){
System.out.println("i="+i);
System.out.println("i="+this.i);System.out.println("i="+super.i);
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
static void static_show(){
System.out.println("i="+i);
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
void print(int i){
System.out.println("i="+this.i);System.out.println("i="+super.i);
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
static void static_print(int i){
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
}
class C extends A{
static int i=9;
void show(){
System.out.println("i="+super.i);
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
static void static_show(){
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
void print(int i){
System.out.println("i="+super.i);
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
static void static_print(int i){
System.out.println("i="+A.i);System.out.println("i="+B.i);
System.out.println("i="+new A().i);System.out.println("i="+new B().i);
}
}
静态函数成员的访问
public class Demo {
public static void main(String[] args) {
A.callMe();B.callMe();
new A().callMe();new B().callMe();
A a=new A();a.method();a.static_method();
B b=new B();b.method();b.static_method();
C c=new C();c.method();c.static_method();
}
}
class A{
static void callMe(){System.out.println("callMe is called!");}//这是所要访问的静态方法
void method(){
callMe();
this.callMe();
A.callMe();B.callMe();
new A().callMe();new B().callMe();
}
static void static_method(){
callMe();
A.callMe();B.callMe();
new A().callMe();new B().callMe();
}
}
class B extends A{
void method(){
callMe();
this.callMe();super.callMe();
A.callMe();B.callMe();
new A().callMe();new B().callMe();
}
static void static_method(){
callMe();
A.callMe();B.callMe();
new A().callMe();new B().callMe();
}
}
class C extends A{
static void callMe(){System.out.println("这个函数被调用!");}
void method(){
super.callMe();
A.callMe();B.callMe();
new A().callMe();new B().callMe();
}
static void static_method(){
A.callMe();B.callMe();
new A().callMe();new B().callMe();
}
}
静态块
块是由大括号包围的一段代码,用static修饰的块称静态块,也称静态初始器(Static Initializer)。它存在于类中并且方法外面。
程序中的类只有在第一次被使用的时候才会被加载,并且只会被加载一次。静态块是类的一部分,它会随类的加载而执行,由于类只加载一次,所以它也会只执行一次。
静态块的执行往往用来初始化静态变量。
public class Demo {
public static int i;
static{
i = 10;
System.out.println("Now in static block.");
}
public void test() {
System.out.println("test method: i=" + i);
}
public static void main(String[] args) {
System.out.println("Demo.i=" + Demo.i);
new Demo().test();
}
}
程序输出:
Now in static block.
Demo.i=10
test method: i=10
静态导入
这是Java 5的新增特性,用来导入类的静态变量和静态方法。
一般我们导入类可以写:
import packageName.className; // 导入包中特定的类
import packageName.*; // 导入包中所有类
而静态导入可以这样写:
import static packageName.className.methodName; // 导入特定的静态方法
import static packageName.className.*; // 导入类中所有静态成员
导入后,可以在当前类中直接用方法名调用静态方法,不必再用 className.methodName 来访问。
对于频繁使用的静态变量和静态方法,可以将其静态导入。静态导入的好处是可以简化书写,例如输出语句 System.out.println(); 中的 out 就是 System 类的静态变量,可以通过 import static java.lang.System.*; 将其导入,下次直接调用 out.println() 就可以了。
import static java.lang.System.*;
import static java.lang.Math.random;
public class Demo {
public static void main(String[] args) {
out.println("产生的一个随机数:" + random());
}
}