静态方法、静态变量
静态方法用static关键词进行标记,静态方法的调用是使用 类名+“.”运算符。而非静态方法则是使用 引用变量名+“.”运算符调用。
//非静态方法,可以声明实例变量。通过引用变量名+“.”运算符调用,例如player.playSound(title); public class Song { String title; public Song(String t) { title=t; } public void play() { SoundPlayer player=new SoundPlayer(); //创建SoundPlayer的实例。 player.playSound(title); } } //静态方法,无法创建实例变量,直接用类名+“.”运算符,例如Math.min(80,50) public static int min (int a,int b) { //返回a,b中的较小值 }
静态方法不能调用非静态变量,同时,静态方法也不能调用非静态方法。
/* * 静态方法不能调用非静态的变量 * 静态方法也不能调用非静态的方法 */ public class Duck { private int size; public static void main(String[] args) { System.out.println("Size of duck is "+size); //调用了实例变量size,此时根本无法知道是哪个size System.out.println("Size is "+getSize); //这一句无法通过编译。调用了getSize()会需要用到size实例变量, } public void setSize(int s) { size=s; } public int getSize() { return size; } }
由上面的代码可知,非静态方法中有实例变量无法通过编译,若非静态方法中没有实例变量也无法通过编译。
静态变量会在第一次载入的时候初始化一次,若程序循环调用该变量不会被反复初始化,而实例变量则会不断初始化。下面这段程序,每有一个Duck duck1=new Duck(3);其构造函数就会被执行一次,其中的duckCount1每次都会被初始化为0,duckCount2只会在第一次被初始化为0。
public class Duck { private int size; int duckCount1=0; static int duckCount2=0; public Duck() { duckCount1++; //每当该构造函数被执行时,此变量的值会不断被初始化为0 duckCount2++; //而此变量则会不断执行递增,duckCount2只会在第一次载入是被初始化为0 } public void setSize(int s) { size=s; } public int getSize() { return size; } }
同一个类的所有实例共享,实例变量每个实例有一个,静态变量每个类只有一个。duckCount2会在载入类的时候被初始化为0。若没有给静态变量赋初值,其就会被设定为默认值,int、long、short会被设定为0,浮点数默认为0.0,boolean默认为false。同样,静态变量也是通过 类名+“.”运算符调用
final变量一旦被初始化值后就就会一直维持这个值不会再改变。如下面的PI为例,public表示该变量可以被各方读取,static表示你不需要实例,标记为final表示其值不变。需注意常数变量的名称应该要都是大写字母并以下划线分隔,符合命名惯例。
1 public static final double PI=3.1415926535;
静态final变量初始化的方法有两种:
/* * 静态final变量初始化的两种方法: * 1、声明变量的时候直接初始化 * 2、在静态初始化程序中初始化 * 静态初始化程序是一段在加载类时会执行的程序代码,它会在其他程序可以使用该类之前就执行,因此很适合放入final变量的起始程序。 */ public class Bar { //1、声明变量时直接初始化 public static final int BAR_SIGN1=25; //2、在静态初始化程序中初始化 public static final int BAR_SIGN2; static { BAR_SIGN2=(int)Math.random(); } }
final还可以用于其他方面,final的变量(包括实例变量)代表你不能改变其值,final的方法代表你不能覆盖这个方法,final的类代表你不能继承该类,也就是不能创建其子类。
//非静态的final变量 class Foof{ final int size=3; final int whuffie; Foof(){ whuffie=42; } void doStuff(final int x) { //x的值不能被改变 } void doMore() { final int z=7; //z不能被改变 } } //final的方法 class Poof{ final void calcWhuffie() { //绝对不能被覆盖 } } //final的类 final class MyMostPerfectClass{ //不能被继承 }