参考
https://www.cnblogs.com/gxyandwmm/p/9478569.html
https://www.jianshu.com/p/e9a34fd067bc
今天看到了static
,发现对static的关键字还有一些认知上的漏洞,所以就来总结一下
static
在Java是静态的意思,分别有
静态变量
静态方法
静态内部方法(static
只能修饰内部类)
静态块
静态导入
静态变量
private static int NUM = 123;
静态变量的变量名大写
静态变量被所有的对象共享,在内存中只有一个副本
静态变量仅在类初次加载时被初始化
可以直接通过ClassName.NUM
来调用,也可以通过实例访问
静态方法
静态方法可以直接使用对象名调用方法Test1.staticMethod()
class Test1 {
public static void staticMethod(){
System.out.println("静态方法");
}
}
public class test {
public static void main(String[] args) {
Test1.staticMethod();
}
}
// 输出静态方法
静态方法一般用于对静态变量操作,如上面的main
方法对静态变量NUM
操作,不能引用直接非静态变量,如果需要引用非静态变量,只能通过对象引用。
public class StaticMethod {
private int NUM = 0 ;
private static int STATICNUM = 1;
public static void main(String[] args) {
System.out.println(NUM );// 报错
System.out.println(STATICNUM ); // 输出 1
}
}
静态内部类
静态内部类也有静态方法和非静态内部方法,静态变量和非静态变量
对于在静态内部类的静态变量来说
和上面的静态变量性质相同
静态方法
可以直接调用静态内部类再调用静态方法,即
调用静态内部类 -> 调用静态方法
非静态方法
对于需要实例化静态内部类,即
实例化静态内部类 -> 调用非静态方法
public class Outer {
public static void main(String[] args) {
StaticInnerClass.staticMethod();
StaticInnerClass staticInnerClass = new StaticInnerClass();
staticInnerClass.ordMethod();
}
private static class StaticInnerClass{
private StaticInnerClass(){
System.out.println("静态内部类实例化");
}
private static void staticMethod(){
System.out.println("静态内部类,静态方法");
}
private void ordMethod(){
System.out.println("静态内部类,非静态方法");
}
}
/*
静态内部类,静态方法
静态内部类实例化
静态内部类,非静态方法
*/
}
总的来说,对于静态内部类,都无需实例化外部类即可调用静态内部类
静态块
静态块类加载器载入类的时候,这一部分代码被执行,常用于对静态变量进行初始化工作。这些代码只执行一次,不能再调用
public class StaticBlock {
static {
System.out.println("加载静态块");
}
public static void main(String[] args) {
staticMethod();
StaticBlock staticBlock = new StaticBlock();
staticBlock.ordMethod();
}
public void ordMethod(){
System.out.println("普通方法");
}
public static void staticMethod(){
System.out.println("静态方法");
}
/*
加载静态块
静态方法
普通方法
*/
}
静态导入
用import static代替import静态导入包是JDK1.5中的新特性。
import static java.lang.System.out;
这样导入以后可以直接使用类,省略前面的ClassName,如下面的out.println
import static java.lang.System.out;
import static java.lang.Integer.*;
public class TestStaticImport {
public static void main(String[] args) {
out.println(MAX_VALUE);
out.println(toHexString(42))
}
}
文档:http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html