static关键字的用法
各位看官大家好,最近博主会在闲暇之余看一会《Thinking in Java》以及算法数据结构之类的书,简要记录一下自己的所学所得所想,不足之处,请大家帮忙指出!谢谢大家!
当你只想为某特定域分配单一存储空间,不需要创建对象或者希望某个方法不与包含它的类的任何对象关联在一起(未创建对象也能调用该方法),此时通过static关键字就可以满足这两方面的需求。而static具体的用法是什么呢,请看下文:
1、静态变量
static修饰的变量为静态变量,所有类的实例共享同一变量,类在加载时只为该变量分配同一存储空间
static int temp = 10;
当类的某一实例改变了static变量的值时,其他实例的该变量值都会改变。
1 /** 2 * 每次让temp值加1以此来验证所有的实例共享同一static变量 3 */ 4 public void addTemp(){ 5 temp++; 6 } 7 8 @Test 9 public void testStaticVariable(){ 10 StaticVariable sv1 = new StaticVariable(); 11 StaticVariable sv2 = new StaticVariable(); 12 System.out.println("SV.temp:"+StaticVariable.temp+" sv1.temp:"+sv1.temp+" sv2.temp:"+sv2.temp); 13 sv1.addTemp(); 14 System.out.println("SV.temp:"+StaticVariable.temp+" sv1.temp:"+sv1.temp+" sv2.temp:"+sv2.temp); 15 sv2.addTemp(); 16 System.out.println("SV.temp:"+StaticVariable.temp+" sv1.temp:"+sv1.temp+" sv2.temp:"+sv2.temp); 17 sv1.temp = 1; 18 System.out.println("SV.temp:"+StaticVariable.temp+" sv1.temp:"+sv1.temp+" sv2.temp:"+sv2.temp); 19 }
控制台结果如下:
所有实例共享同一static变量。
2、静态方法
不需要实例化就可以直接访问的方法。在静态方法中只能调用静态成员变量和静态方法。在非静态方法中既可以调用静态方法、静态变量也可以调用非静态方法、非静态变量。
1 @Test 2 public void testStaticMethod(){ 3 staticMethod();//静态方法 4 commonMethod();//非静态方法 5 StaticMethod.staticMethod();//无需实例化就可以直接调用静态方法 6 }
3、静态代码块
在方法中,出现的{ }就称为普通代码块。而直接在类中定义,并且有static修饰的代码块称为静态代码块。只在类加载的时候执行一次。在类中直接定义,不用static修饰的代码块称为构造代码块。
普通代码块运行的顺序为按照代码块的顺序进行。静态代码块、构造代码块、构造方法的运行顺序为静态代码块-->构造代码块-->构造方法。
1 public class StaticCodeBlock { 2 public StaticCodeBlock(){ 3 System.out.println("构造方法"); 4 } 5 { 6 System.out.println("构造代码块"); 7 } 8 static { 9 System.out.println("静态代码块"); 10 } 11 12 @Test 13 public void testStaticCodeBlock(){ 14 } 15 }
执行@Test方法时执行结果如下
4、静态内部类
由static修饰的内部类称为静态内部类。在静态内部类只能调用外部静态变量(包括私有变量)。在非静态内部类中可以无缝调用所有外部成员变量。
1 private String msg = "外部类成员变量"; 2 private static int staticTemp = 0; 3 4 5 public void outerMethod() { 6 Inner inner = new Inner(); 7 System.out.println(inner.innerTemp); 8 System.out.println(StaticInner.staticInnerTemp); 9 } 10 11 public class Inner { 12 int innerTemp = 2; 13 // static int staticTemp = 2; 非静态内部类中不能定义静态变量 14 public void commonInnerMethod() { 15 System.out.println(msg); 16 System.out.println(staticTemp); 17 } 18 }
5、静态导包
通过import static 导入所有(某个)静态方法。可以直接通过方法名调用该方法
在StaticMethod类中写个静态方法
1 public static void print(String s){ 2 System.out.println(s); 3 }
在StaticImport中静态导入该static方法。可以通过print()直接调用该方法。
import static cn.com.leon.staticProject.StaticMethod.print;
@Test public void testStaticImport(){ print("a"); }
本文的代码已经上传到我的GitHub有需要的看官可以自行下载。https://github.com/DreamsChaser/static-project