• 静态方法、静态变量


    静态方法用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{
            //不能被继承
        }
  • 相关阅读:
    让ios支持openssl
    数组
    NSValue
    音频
    NSObject分类
    NSJSONSerialization
    Java并发编程-深入探讨synchronized实现原理
    设计模式-挖掘工厂模式应用场景-全面分析工厂模式原理
    Spring插件安装
    Java并发编程-深入Java同步器AQS原理与应用-线程锁必备知识点
  • 原文地址:https://www.cnblogs.com/do-hardworking/p/10480439.html
Copyright © 2020-2023  润新知