static关键字的几种用法

  • 修饰成员变量,和方法
  • 修饰内部类
  • 修饰代码块
  • 静态导包

修饰成员变量和方法

static修饰的成员变量或方法属于类,不属于对象。所有该类的实例都共享一个变量或方法。放在内存的方法区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class JavaStatic {

/**
* 静态成员变量
*/
private static int age;

/**
* 静态方法
*/
private static void printName(){
System.out.println("Name");
}

public static void main(String[] args) {
/*静态成员变量或方法直接使用类名进行调用*/
System.out.println(JavaStatic.age);
JavaStatic.printName();
}
}

静态内部类

静态内部类与非静态内部类之间存在一个最大的区别就是,非静态内部类 的创建需要依赖于外围类的创建,而静态内部内则不需要依赖于外围类的创建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class JavaStatic {

private static int num=10;

/**
* 静态内部类是属于外围类的,而不是外围类的对象
*/
private static class inner{
public void printNum(){
System.out.println(num);
}
}

public static void main(String[] args) {
JavaStatic.inner inner=new JavaStatic.inner();
inner.printNum();
}

}

静态代码块

静态代码块,只在该类被加载的时候运行。所以不管创建多少对象,其静态代码块只执行一次。
执行的顺序是:静态代码块—>非静态代码块—>构造器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class JavaStatic {

{
System.out.println("非静态代码块");
}

static {
System.out.println("静态代码块");
}

public JavaStatic(){
System.out.println("构造器");
}
public static void main(String[] args) {
JavaStatic javaStatic=new JavaStatic();
}

}

输出结果

1
2
3
>>静态代码块
>>非静态代码块
>>构造器

静态导包(jdk1.5后引入)

使用import static 关键字进行导包,可以导入该包中的静态资源,可以直接调用其中的静态方法和静态成员变量,而不需要使用类名。

1
2
3
4
5
6
7
8
9
10
import static java.lang.Math.*;
public class JavaStatic {

public static void main(String[] args) {
System.out.println("直接调用其中的静态成员变量PI"+PI);
System.out.println("直接调用其中的静态方法"+max(5,3));
}

}