static关键字详解
一:static关键字用途
1:static方法就是没有this的方法。
2:static方法内部不能调用非静态方法,反过来是可以的。
3:方便在没有创建任何对象的前提下仅仅通过类本身来调用方法和属性。
二:static的用法
用来修饰类的成员变量、类的成员方法、静态代码块。
三:static方法
1:static方法称为静态方法,不依赖对象访问,没有this。
2:静态方法不能访问非静态成员,非静态方法可以访问静态成员。
例如:
public class StaticTest { public static void a() { System.out.println("aaaaaa"); } public void b() { this.a(); //非static方法可以访问static方法(this可省略) } public static void main(String[] args) { StaticTest st = new StaticTest(); st.b(); //static方法访问非static方法需要通过对象来访问 } }
四:static变量
1:static变量称作静态变量。
2:静态变量被所有对象共享,仅一个副本,类被初次加载时初始化。
3:非静态变量被对象所拥有,有多个副本,创建对象时初始化。
4:静态方法不能直接访问非静态变量,可通过创建对象方式间接进行访问。
例如:
public class StaticTest { private int a =1; //非静态成员变量 private static double b =1.0; //静态成员变量 public static void a() { //System.out.println(a); //直接访问编译报错 System.out.println(b); //直接访问编译通过 } public void b() { System.out.println(a); //非静态方法访问静态变量 } public static void main(String[] args) { StaticTest st = new StaticTest(); System.out.println(st.a); //静态方法访问非静态变量需要通过对象(间接)来进行访问 } }
五:static代码块
1:静态代码块用于优化程序性能。
2:类被初次加载时,按照静态代码块顺序执行每个static块,并且只会执行一次。
3:静态代码块可以置于类的任何位置,且可以有多个static块。
例如:
class Person{ private Date birthDate; public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { Date startDate = Date.valueOf("1946"); Date endDate = Date.valueOf("1964"); return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; } }
以上代码每次调用isBornBoomer()方法时都会创建两个对象(startDate、endDate),占用内存,造成空间的浪费。
class Person{ private Date birthDate; private static Date startDate,endDate; static{ //静态代码块 startDate = Date.valueOf("1946"); endDate = Date.valueOf("1964"); } public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; } }
使用静态代码块对程序进行优化,两个对象(startDate、endDate)仅在类初次加载时初始化一次,极大提高效率。