关键点
《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
张三 艺术与传媒学院
李四 艺术与传媒学院
王五 艺术与传媒学院