Java-static关键字

一、static关键字的用途

static方法就是没有this的方法。Static方法内部不能调用非静态方法,反过来是可以的。可以再没有创建对象的前提。可以通过类的本身来调用static方法。这才是static真正的用法。

总结:static方便在没有创建对象的情况下进行调用(方法/变量)。很显然,被static关键字修饰的方法和变量不需要依赖于对象来访问,只要类被加载了,就可以通过类名去访问。

1、static方法

一般称为静态方法,静态方法不依赖于任何对象就可以访问,因此对静态方法来说,是没有this的。(没有对象,谈何this)由于这个特性,静态方法中不能访问类的非静态成员方法和变量。因为非静态方法和变量都是依赖具体的对象才能够被调用。

但是在非静态方法中可以访问静态成员方法和变量。举个栗子:

 1 public class Main {
 2     private static String str1 = "staticProperty";
 3     private String str2 = "property";
 4     
 5     public Main() {
 6         
 7     }
 8     
 9     public void print() {//非静态调用静态没有问题
10         System.out.println(str1);
11         System.out.println(str2);
12         print2();
13     }
14     
15     public static void print2() {//静态调用非静态报错
16         System.out.println(str1);
17         System.out.println(str2);//Cannot make a static reference to the non-static field str2
18         print();//Cannot make a static reference to the non-static method print() from the type Main
19     }
20 }

对于非静态成员,他访问静态成员方法/变量显然是没有限制的。最常见的main方法也是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。注意,即使没有显示声明为static,类的构造器实际上也是静态方法。

2、static变量

static变量也称为静态变量,静态变量和非静态变量的区别:静态变量被所有对象共享,在内存中只有一个副本,它当且仅当在类的初次加载时会被初始化。而非静态变量是对象拥有的,在创建对象的时候被初始化,存在多个副本,各个对象的副本互不影响。

static成员变量的初始化顺序按照定义的顺讯来进行初始化。

3、static代码块

static关键字关键作用:形成静态代码块以优化程序性能。static块可以置于类的任何地方,类中可以有多个static块,类初次加载时,会按照static块的执行顺序来执行每个static块,并且只会执行一次。

static块优化程序原理:只会在类加载的时候执行一次。

举个栗子:

 1 import java.sql.Date;
 2 
 3 public class Main {
 4     private Date birthDay;
 5     
 6     public Main(Date birthDay) {
 7         this.birthDay = birthDay;
 8     }
 9     
10     boolean isBornBoomer() {
11 /*        每次调用isBornBoomer,都会生成startDate和endDate两个对象,造成空间浪费。
12 */    
13         Date startDate = Date.valueOf("1995");
14         Date endDate = Date.valueOf("2017");
15         return birthDay.compareTo(startDate)>=0&&birthDay.compareTo(endDate)<0;
16     }
17 }

优化例子:

 1 import java.sql.Date;
 2 
 3 /**
 4  *很多时候会把只需要进行一次初始化操作都放在static代码块中进行。*/
 5 public class Main {
 6     private Date birthDay;
 7     private static Date startDate,endDate;
 8     //只需要初始化一次
 9     static {
10         startDate = Date.valueOf("1995");
11         endDate = Date.valueOf("2017");
12     }
13     
14     public Main(Date birthDay) {
15         this.birthDay = birthDay;
16     }
17     
18     boolean isBornBoom() {
19         return birthDay.compareTo(startDate)>=0 && birthDay.compareTo(endDate)<0;
20     }
21 }

二、static关键字误区

1、static关键字会改变类中成员的访问权限吗?

不会。Java中影响限权的只有private,public,protected,default(包括包访问限权)这几个关键字。

2、能用this访问静态成员变量吗?

举个栗子:

 1 public class Main {
 2     static int value = 22;
 3     
 4     public static void main(String[] args) {
 5         new Main().printValue();
 6     }
 7     
 8     public void printValue() {
 9         int value = 2;
10         System.out.println(this.value);
11     }
12 }
13 /*
14 结果:
15 
16     22
17 
18 */

盲目分析:

  this代表当前对象,static是被对象共享的,无疑结果是22 。printValue方法中的value是局部变量,根本不可能和this关联,所以输出22

注意:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态成员方法和变量都可以通过对象去访问(限权足够下)。

3、static能作用于局部变量吗?

在Java中这是不允许来修饰局部变量的,没有为什么,这就是规定(冷漠)。

还有就是要注意的关于程序运行顺序的问题。被说了,我要八千,我都会。

原文地址:https://www.cnblogs.com/zpoor/p/7605185.html