static的用法

static,意为静态的,是一个状态修饰符。

1.修饰变量

static修饰的变量称为静态变量,可以使用类名.变量名直接调用,并且该变量只存在一份,被所有的实例共享。

(1)类名.变量名调用静态变量:

例:

package com.dh.oop;

public class StaticField {

    public static int num = 1;

}
package com.dh.oop;

public class StaticFieldApplication {

    public static void main(String[] args) {
        //类名调用
        System.out.println(StaticField.num);
    }
}

(2)静态变量只存在一份,被所有的实例共享:

例:

package com.dh.oop;

public class StaticField {

    public static int num = 1;

}

package com.dh.oop;

public class StaticFieldApplication {

    public static void main(String[] args) {

        //实例化两个变量,并分别为num赋值
        StaticField staticField1 = new StaticField();
        staticField1.num = 2;
        
        StaticField staticField2 = new StaticField();
        staticField2.num = 3;

        System.out.println(staticField1.num);
        System.out.println(staticField2.num);
    }
}

通过以上代码,若所有实例共享一份静态变量的话,输出的值应该都为3,否则,为2,3

可以看到,结果为两个3,由此可证,所有实例共享一份静态变量。

2.修饰方法

被static修饰的方法称为静态方法。可以被类名直接调用;静态方法中只能直接使用静态属性和调用静态方法,若是非静态属性和非静态方法的的话只能通过对象调用。

(即:在非静态方法中,既可以使用静态变量和静态方法,也可以使用非静态变量和非静态方法。但是在静态方法中,只能直接使用静态变量和静态方法,若想使用非静态的变量和非静态的方法,就需要借助对象。)

(1)类名.方法名调用静态方法:

例:

public int num;
    public static int num1;
    
    public void show(){
        System.out.println("非静态show方法");
    }
}
package com.dh.oop;

public class StaticMethodApplication {

    public static void main(String[] args) {
        StaticMethod.show();
    }
}

(2)静态方法中调用静态属性、静态方法和非静态属性、静态方法:

例:

package com.dh.oop;

public class StaticMethod {

    public static int num;
    public int num1;
    
    public static void show(){
        System.out.println("静态show方法");
    }

    public void show1(){
        System.out.println("非静态show方法");
    }

    public static void main(String[] args) {

        //1.静态方法中调用静态属性和静态方法
        //(1)直接使用类名调用
        StaticMethod.num = 1;
        StaticMethod.show();
        //(2)使用对象调用
        StaticMethod staticMethod = new StaticMethod();
        staticMethod.num = 2;
        staticMethod.show();
        //(3)若是在本类的方法中,还能直接使用,其它类中就不可以使用此种方法
        num = 3;
        show();

        //2.静态方法中调用非静态属性和非静态方法
        //使用对象调用
        staticMethod.num1 = 1;
        staticMethod.show1();
    }
}

(3)非静态方法中调用静态属性、静态方法和非静态属性、静态方法:

例:

package com.dh.oop;

public class StaticMethod {

    public static int num;
    public int num1;

    public static void show(){
        System.out.println("静态show方法");
    }

    public void show1(){
        System.out.println("非静态show方法");
    }
    
    public void test(){
        //1.非静态方法中调用静态属性和静态方法
        //(1)在本类中,可以直接使用
        num = 1;
        show();
        //(2)直接使用类名调用
        StaticMethod.num = 2;
        StaticMethod.show();
        //(3)使用对象调用
        StaticMethod staticMethod = new StaticMethod();
        staticMethod.num = 2;
        staticMethod.show();

        //2.非静态方法中调用非静态属性和非静态方法
        //(1)在本类中,可以直接使用
        num1 = 1;
        show1();
        //(2)直接使用类名调用
        staticMethod.num1 = 2;
        staticMethod.show1();
    }

    public static void main(String[] args) {
        StaticMethod staticMethod = new StaticMethod();
        staticMethod.test();
    }
}

所以可以看出,只要使用对象的话就相当于没有限制了;如果是static修饰的话,使用类名调用就不需要创建对象了。

(4)扩展:在static修饰的方法中不能出现this和super(之后会讲解super)。

3.修饰代码块

我们之前说过,在类体中是不允许直接出现可执行语句的,像流程控制、赋值、打印等语句,但是只要我们将其放在{},即代码块中就没有问题了。

代码块语法:类体中

{

//语句

};

(分号可加可不加)

例:

package com.dh.oop;

public class CodeBlock {

    {
        int a;
        a = 10;
        if(a == 10){
            System.out.println("a为10");
        }
        System.out.println("这是代码块");
    }

    public static void main(String[] args) {
        CodeBlock codeBlock = new CodeBlock();
    }
}

注意:需要注意的是必须要new对象的时候代码块才会执行,没有new对象的时候是不会执行的。

用static修饰的代码块叫静态代码块。

代码块语法:类体中

static{

//语句

};

(分号可加可不加)

例:

package com.dh.oop;

public class StaticCodeBlock {

    static {
        int b;
        b = 100;
        if(b == 100){
            System.out.println("a为100");
        }
        System.out.println("这是静态代码块");
    }

    public static void main(String[] args) {
        
    }
}

注意:static修饰的代码块,不需要new对象也可以运行。当然,new对象的时候也是会执行的。我们可以利用静态代码块来执行一些加载类就需要完成初始化且只需要初始化一次的内容。

4.代码块、静态代码块、构造方法的执行顺序

构造方法是在new对象的时候被调用的,现在说静态代码块和代码块也会在new操作时运行,那它们的执行顺序是什么呢?我们来试验一下:

package com.dh.oop;

public class Test {
    //代码块
    {
        System.out.println("代码块");
    }

    //静态代码块
    static {
        System.out.println("静态代码块");
    }

    //构造方法
    public Test() {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println("====================");
        Test test1 = new Test();
    }
}

我们来看看结果:

可以看到,执行顺序为:静态代码块 > 代码块 > 构造方法

并且,静态代码块只执行一次!在第一次执行代码的时候,不管有没有new对象,而代码块和构造方法则在new对象就会执行,new几个对象就执行几次。


本人水平有限,若有错误,请指出,感激~

posted @ 2021-01-20 11:21  deng-hui  阅读(1217)  评论(0编辑  收藏  举报