static关键字通常应用在字段、方法、静态块,还有冷门一点的内容:静态内部类、静态导入
static字段:
static字段也就是静态变量,是属于类的,被所有的对象所共享,只有当类初次加载的时候保存到内存中,在内存中只保存一份
实例变量是属于对象的,在创建对象的时候进行初始化,每个对象的实例变量是互斥的,不会相互影响
PS:static是不允许用来修饰局部变量,无论是方法、静态块、代码块
static方法:
public class A{ private static int i = 1; private String s; private void del() { System.out.println("del()"); add(); } public static void add() { System.out.println(s); this.del(); System.out.println("add()"+ i); } }
因为静态方法是属于类的,不需要依赖对象去调用,内部是没有this的,所以静态方法中无法使用this,也无法调用非静态方法和变量,反
过来却可以的。但是如果在静态方法中new一个对象,然后调用非静态方法,是可以正常运行的
public static void add() { A a = new A(); a.del(); System.out.println(a.s); System.out.println("add()"+ i); }
静态块:
静态块和静态变量一样在首次类加载的时候进行初始化,这是我们使用它的一个重要的原因
public class A{ private static int i = 1; private String s = "aaa"; static { System.out.println("A static block1"); } private void del() { System.out.println("del()"); add(); } { System.out.println("A block"); } static { i1 = 2; // System.out.println(i1); System.out.println("A static block2"); } public static void add() { System.out.println("add()"); } private static int i1; }
public class B extends A{ static { System.out.println("B static block1"); } { System.out.println("B block"); } public B() { System.out.println("B Constructor"); } static { System.out.println("B static block2"); } }
public class Test { private static B b = new B(); public static void main(String[] args) { new B(); A.add(); } }
结果:
A static block1 A static block2 B static block1 B static block2 A block B block B Constructor A block B block B Constructor add()
静态块的特点:
1、静态块内部可以对定义在其后面的静态变量进行赋值,但是不能使用
2、静态块只会加载一次,按照代码定义顺序进行加载
3、类加载的顺序:父类静态块-->子类静态块-->父类代码块-->父类构造器-->子类代码块-->子类构造器
非静态块可以加载多次
静态内部类:
这部分内容可以参考我之前的内容:https://www.cnblogs.com/huigelaile/p/11009436.html,或者自行百度
静态导入:
之前static相关内容没想到过这个内容,但是在公众号有看到一篇关于面试的文章,面试官问关于static的内容,如果能够回答到静态导入,
印象应该会很好
格式:
import static 包名.类名.方法名
import static java.lang.System.*; import static java.lang.Math.*; public class Test { public static void main(String[] args) { out.println("abc"); System.out.println(round(1.2)); } }
PS:jdk1.5出现的特性
1、静态导入的方法必须是静态的
2、静态导入可以不调用包名,直接使用包里的静态方法
原文地址:https://www.cnblogs.com/huigelaile/p/11024641.html