静态方法、静态变量

静态方法用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{
        //不能被继承
    }

 

posted @ 2019-03-06 10:47  大大木瓜  阅读(463)  评论(0编辑  收藏  举报