基本用法
- 静态变量和静态方法
属于类的静态资源,类实例之间共享,方便在没有创建对象时使用,类的构造方法实际也是static方法。
静态资源是类初始化时候加载的,而非静态资源是new时候加载的。形如Class.forName("xxx")
方法,就只初始化了类,并没有new它,故只是加载了这个类的静态资源。
静态方法不能引用非静态资源
静态方法能引用静态资源
非静态资源能引用静态资源 - 静态块
可以放在类中的任何地方,也可以有多个,将一些只需进行一次初始化的操作放在static代码块中可优化性能
静态资源的加载顺序是严格按照静态资源的定义顺序来加载的
public class A
{
c = 3;
System.out.println(c); //error
}
private static int c;
静态代码块对定义在其之后的静态变量可以复制,但是不能访问。
3. 静态内部类
static不能修饰外部类,只能修饰内部类
4. import static
import static两个关键字连用可指定导入某个类中的指定静态资源,使用时就可不需要使用类名.资源名,可以直接使用资源名,不能写成static import,例如下面导入Math下的所有静态资源
import static java.lang.Math.*;
public class A
{
public static void main(String[] args)
{
System.out.println(sin(2.2));
}
}
注意
- static并不会改变类中成员的访问权限即作用域,和C/C++不同
- 静态方法和静态变量都可以通过对象访问(只要访问权限足够)
- Java中static不允许修饰局部变量,和C/C++不同
面试题举例
public class Test {
Person person = new Person("Test");
static{
System.out.println("test static");
}
public Test() {
System.out.println("test constructor");
}
public static void main(String[] args) {
new MyClass();
}
}
class Person{
static{
System.out.println("person static");
}
public Person(String str) {
System.out.println("person "+str);
}
}
class MyClass extends Test {
Person person = new Person("MyClass");
static{
System.out.println("myclass static");
}
public MyClass() {
System.out.println("myclass constructor");
}
}
输出:
test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor
执行顺序:
类加载Test—>类加载MyClass—>生成MyClass对象(先初始化父类的成员变量Person,进而引起类加载Person—>生成Person对象—>生成Test对象—>生成MyClass中的Person对象—>生成MyClass对象)