被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();
}
}
五种作用都包含其中,很容易看到效果。