修饰符static的五种用法

被static修饰的类、方法等都是静态的,也就是不依赖实例进行创建,在类被第一次访问的时候就加载了。static出现的地方以及所起的作用大概有五种:

1. 修饰静态属性;
2. 修饰静态方法;
3. 修饰静态内部类;
4. 静态导包(类或者方法,可以通配);
5. 标记静态代码块。

我们用一个demo来测试一下。

建一个普通的java项目,建立一个包com.chris.demo.statictest

1. 创建一个工具类MyUtils,工具类一般放置我们封装好的一般逻辑,方便我们使用,对于使用率比较高的,我们不需要依赖于实例,所以使用静态方法。

package com.chris.demo.statictest;

import static java.lang.System.out;

/**
 * 模拟工具类
 * 工具类使用率较高的方法一般使用静态方法
 */
public class MyUtils {
    //静态方法
    public static void log(Object object) {
        out.println(object);
    }
}

可以看出我们在这个类里面已经使用了静态导包,静态导包的好处就是可以直接使用对象或者方法,不用再依赖于对象对象或者类来调用,如:原来经常使用的System.out.println("Hello,World!");现在就变成out.println("Hello,World!");了。

2. 创建一个类MyClass,包含一个普通的内部类,一个静态内部类,和一个静态内部对象,还有普通方法和静态方法。

package com.chris.demo.statictest;

import static com.chris.demo.statictest.MyUtils.log;

/**
 * 模拟一个复杂的类
 * 其中包含一个普通内部类和一个静态内部类
 * 静态内部类包含普通方法和静态方法
 * 还有一个静态内部对象
 * 类的实例化和方法的调用各不相同
 */
public class MyClass {
    public static MyStaticInnerClass cls = new MyStaticInnerClass();

    class MyInnerClass {
        public void show() {
            log("普通内部类实例 普通方法");
        }
    }

    static class MyStaticInnerClass {
        public void show() {
            log("静态内部类实例 普通方法");
        }

        public static void showInfo() {
            log("静态内部类或实例 静态方法");
        }
    }
}

在这个类里面我们调用了刚才创建的工具类,使用静态导包,直接导入方法,使用的时候不用指定类,直接使用方法。不过也只有静态方法可以这样。

3. 最后我们创建一个测试类StaticTest,来查看效果:

package com.chris.demo.statictest;

import static com.chris.demo.statictest.MyUtils.log;
import static java.lang.System.out;
/*
修饰符static的作用总结起来大概有五种:
1. 修饰静态属性;
2. 修饰静态方法;
3. 修饰静态内部类;
4. 静态导包(类或者方法,可以通配);
5. 标记静态代码块。
 */

public class StaticTest {
    private static String msg;

    static {
        msg = "在静态代码块中给静态属性赋值";
    }

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

    private static void test1() {
        out.println("静态导包");
    }

    private static void test2() {
        log("导入静态方法");
    }

    private static void test3() {
        log(msg);
    }

    private static void test4() {
        //普通内部类的实例化
        MyClass myClass = new MyClass();
        MyClass.MyInnerClass innerClass1 = myClass.new MyInnerClass();
        //MyClass.MyInnerClass innerClass2 = (new MyClass()).new MyInnerClass();
        innerClass1.show();
        //静态内部类的实例化
        MyClass.MyStaticInnerClass staticInnerClass = new MyClass.MyStaticInnerClass();
        //静态内部类实例的普通方法
        staticInnerClass.show();
        staticInnerClass.showInfo();
        //静态内部类的静态方法
        MyClass.MyStaticInnerClass.showInfo();
        //静态成员的方法调用,类似System.out.println("Hello,World!");
        MyClass.cls.show();

    }
}

五种作用都包含其中,很容易看到效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章