【Java基础】static关键字

通过static声明的属性或者方法可以通过类名称直接调用

static方法只能调用static属性或者方法,不能调用非static属性或者方法

非static方法则不受限,可以任意调用static声明的属性或者方法

注意:main方法本身就是一个static方法

示例1:static方法调用非static和static属性

public class StaticTest {

    static String staticStr = "这是一个静态变量";
    String norString = "这是一个普通变量";

    public static void main(String[] args){
        norString = "aa";
    }
}

运行代码会提示:Error:(10, 9) java: 无法从静态上下文中引用非静态 变量 norString

public class StaticTest {

    static String staticStr = "这是一个静态变量";
    String norString = "这是一个普通变量";

    public static void main(String[] args){
        staticStr = "aa";
    }
}

则会正常运行

示例2:static方法调用非static方法和static方法

public class StaticTest {

    static String staticStr = "这是一个静态变量";
    String norString = "这是一个普通变量";

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

    public void norFun(){

    }
}

提示:Error:(10, 9) java: 无法从静态上下文中引用非静态 方法 norFun()

public class StaticTest {

    static String staticStr = "这是一个静态变量";
    String norString = "这是一个普通变量";

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

    public static void norFun(){

    }
}

可以正常编译

示例三:普通方法调用static属性和方法

public class StaticTest {

    static String staticStr = "这是一个静态变量";
    String norString = "这是一个普通变量";

    public static void main(String[] args){
        new StaticTest().norFun();
    }

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

    public void norFun(){
        staticStr = "aaa";
        staticFun();
    }

}
会发现编译正常通过

原因:内存可以分为四部分,栈内存、堆内存、全局数据区、全局代码区,static保存在全局数据区,所有的非static定义的结构必须是产生了实例化对象才会分配空间然后使用,而static定义的结构不受实例化对象的控制,可以在没有实例化对象的时候进行访问

猜你喜欢

转载自blog.csdn.net/guo_ridgepole/article/details/80672629