浅析Java中的static关键字

关键点

《Java编程思想》对static方法的描述:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建对象的前提下,仅仅通过类本身来调用staic方法。这实际上正是static方法的主要用途。”

虽然它只说明了static方法,但可以看出static关键字的主要作用:在没有创建对象的前提下,通过类本身来调用静态方法,访问静态域,获取静态常量;在类加载时执行静态块;导入包中的静态方法和静态常量。

1.静态域(极少使用)

如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。

class Student{
private static String faculty = "计算机学院";
...
}

如上,如果这个类创建了多个Sutdent实例,所有实例将共享这个faculty;即便没有对象,静态域也存在,它属于类,不属于任何独立的对象。

2.静态常量(常用)

与非静态常量的不同在于,每个类的实例都有一份普通常量,而整个程序中只存在一份静态常量。

public final int Year = 2015;
public static final int Year = 2015;  //更节省空间

3.静态方法

静态方法是一种不能向对象实施操作的方法,它没有this参数,不能访问实例域。通过class.method来调用。(也可以像调用实例方法使用object.method来调用,但不推荐)

class Student{
  ...
  public static String getFaculty() {
     return faculty;
  }
  ...
}
//Student.getfaculty()   使用class.method调用

在以下情况下使用静态方法:

1)一个方法不需要访问对象状态,其所有参数都是通过显示参数提供

2)一个方法只需要访问类的静态域

限制

1)不可升级,重写

2)固定占用内存,不被释放

4.静态块

特点:类加载时,对象创建之前执行,在整个应用程序的生命周期只执行一次。

public class Test {
    public static void main(String[] args){
        mytest a = new mytest();
        mytest b = new mytest();
    }
}

class mytest{
    static {
        System.out.println("静态块执行");
    }
    public mytest(){
        System.out.println("构造器执行");
    }
}
执行结果:

静态块执行
构造器执行
构造器执行

5.静态导入

使用import static xxx来导入静态方法和静态常量

import static java.lang.System.out;
out.println("hello world!");  //可使用out而不用System.out

代码实例:

 1 import java.util.Random;
 2 
 3 import static java.lang.System.out;     //静态导入
 4 
 5 class StuentTest
 6 {
 7     public static void main(String[] args) {
 8         Student[] test = new Student[3];
 9         test[0] = new Student("张三","20151000153","01",3.4);
10         test[1] = new Student("李四","20150000231","02",2.9);
11         test[2] = new Student("王五","20151000462","03",4.2);
12 
13         double average = 0;
14         for (Student i:test) {
15             out.println(i.getName() +' '+Student.Year+' '+Student.getFaculty()+' '+Student.getFacilty_id()+' '+ i.getStu_id()+' ' + i.getClass_id()+' ' + i.getGpa());
16             //类名.方法名调用静态方法,获取静态常量
17             average += i.getGpa();
18         }
19         out.println("average_gpa:" + average/3);
20         Student.setFaculty("艺术与传媒学院");  //改变静态常量
21         for(Student i:test){
22             out.println(i.getName()+' '+Student.getFaculty());
23         }
24     }
25 }
26 
27 class Student
28 {
29     private String name;
30     public static final int Year = 2015;    //静态常量
31     private static String faculty = "计算机学院";    //静态变量
32     private static int facilty_id;
33     private String stu_id;
34     private String class_id;
35     private double gpa;
36 
37     //静态块
38     static {
39         Random generator = new Random();
40         facilty_id = generator.nextInt(19);
41     }
42 
43     public Student(String name,String stu_id,String class_id,double gpa) {
44         this.name = name;
45         this.stu_id = stu_id;
46         this.class_id = class_id;
47         this.gpa = gpa;
48     }
49 
50     public static String getFaculty() {
51         return faculty;
52     }
53 
54     public static int getFacilty_id()
55     {
56         return facilty_id;
57     }
58 
59     public String getName() {
60         return name;
61     }
62 
63     public String getStu_id() {
64         return stu_id;
65     }
66 
67     public String getClass_id() {
68         return class_id;
69     }
70 
71     public double getGpa(){
72         return gpa;
73     }
74 
75     public static void setFaculty(String str){
76         faculty = str;
77     }
78 }

执行结果:

张三 2015 计算机学院 7 20151000153 01 3.4
李四 2015 计算机学院 7 20150000231 02 2.9
王五 2015 计算机学院 7 20151000462 03 4.2
average_gpa:3.5
张三 艺术与传媒学院
李四 艺术与传媒学院
王五 艺术与传媒学院

原文地址:https://www.cnblogs.com/lht-record/p/8325068.html