通过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定义的结构不受实例化对象的控制,可以在没有实例化对象的时候进行访问