Static修饰符
- static修饰符可以用来成员变量,成员方法和代码块
- 用static修饰的成员变量表示静态变量,可以直接通过类名来访问
- 用static修饰的成员方法称为静态方法,可以直接通过类名来访问
- 用static修饰的代码块称为静态代码块,当JVM加载类时,就会自动的执行该代码块。
- 被static修饰的成员变量和成员方法表明归某个类所有。它不依赖于类的特定的实例.被这些类的实例所共享 ,会在类加载的时候,完成对属性或方法的一些初始化操作。
static修饰属性
- 类的变量有两种,一种是被static修饰的变量,称为静态变量/类变量;另一种是没有static修饰的,称为实例变量,二者的的区别是
- 对于实例变量,每创建一个对象,就会为实例变量分配一次内存.实例变量载内存中有多个拷贝,互不影响。
- 静态变量在内存中只有一个拷贝.运行时JVM只为静态变量分配一次内存.在加载类的过程中完成静态变量的内存分配。
- 在类的内部,可以在任何的方法中直接访问静态变量.在其他类中,可以通过类名+“.”的方法来访问,也可以通过创建一个对象,然后通过对象名来访问。
- 如果类的所有实例中都包括一些相同的常量属性,可以把这样变量作出静态变量,从而节省内存空间。
注:static修饰属性注意事项一:
- 只能修饰实例变量不能修饰局部变量
- static修饰的属性为全类共有,可以通过类名.属性名的方式访问,每一个对象对类变量进行修改,其他对象也会体现出来。
static修饰方法
- 成员方法分为静态方法和成员方法.被static修饰的称为静态方法或类方法.静态方法和静态变量一样,可以不用创建类的实例,而直接通过类名来访问。
- 作为程序入口的main()方法是静态的:JVM只要加载了main()方法所属的类,就能执行main()方法,而不用创建这个类的实例。
非静态方法无论属性和方法是否是静态的都可以访问:
public class TestStaticMethod2 { int a ; static int b; public static void test1(){} public void test2(){} public void test3(){ System.out.println(a); System.out.println(b); test1(); test2(); } }
静态方法只能访问静态属性和静态方法
- 实例方法中可以访问到:所有
静态方法可以访问:静态成员
public class TestStaticMethod3 { static int a= 10; int b = 20; public void test1(){} public static void test2(){} public static void test3(){ System.out.println(a); //System.out.println(b); //错误 //test1(); //错误 test2(); } }
- 静态方法中不能使用this关键字
- 非静态方法只能覆盖非静态方法
静态方法只能覆盖静态方法,但是没有多态
public class TestStaticOverride { public static void main(String args[]){ Super s = new Sub(); s.m();//等效于 Super.m() } } class Super{ public static void m(){ System.out.println("this is super"); } } class Sub extends Super{ public static void m(){ System.out.println("this is sub"); } }
static静态代码块
- 被static修饰的代码块称为静态代码块.JVM在加载类时会执行这些静态代码块.如果类中有多个静态块,JVM会按照他们在类中出现的顺序依次执行它们,每个静态块只会被执行一次.通常用于初始化静态变量
- 静态块和静态方法一样,不能直接访问类的实例变量和实例方法
静态导入
- 通过静态导入可以在使用一个类型静态成员的时候,不用书写类名,直接使用静态成员即可
注意:静静态导入会降低程序的可读性,不要过多使用!
import static java.lang.Math.*;//import static java.lang.Math.PI; import static java.lang.System.*; public class TestStatic { public static void main(String args[]) { System.out.println(PI); System.out.println(abs(-1)); out.println(PI); } }
static小结
- static属性
- 属于这个类所有
- 通过“对象名.static属性名”、“类名.static属性名”访问
- static方法
- 通过“类名.static方法名”和“对象名.static方法名”访问
- static代码块
- 主要作用是实现static属性的初始化
- 当类被载入的时候执行它,且只被执行一次