java学习面向对象之static内存图解
上一节当中描述了static的用法,以及成员变量和静态变量的区别。但是static除了可以修饰成员变量使之成为静态变量外,他还可以同时修饰函数,使之成为静态函数,我们来看一个例子:
class StaticDemo { String name; int a ; static String xiangmu="xiangmu"; /** *这个方法被static关键词修饰之后,就变成了静态方法,这里我们需要注意的一点就是static声明的方法当中,只能够调用 *静态变量,因为他是在类没有被初始化为对象之前而存在的,所以这个静态方法当中不能使用this或者super之类的关键词 * */ StaticDemo(String name,int a) { this.name = name; this.a = a; } static void saySelf() { /** *这种方法是不能够使用的,为什么?因为这个时候this可能还没有初始化呢,记住静态变量还有静态方法是先于实例化对象 *之前而存在的!!! */ //!!!!System.out.print(this.name);//此时我们如果编译的话会提示我们说静态上下文当中不能够引用非静态变量的编译错误 System.out.print(xiangmu);//这里的xiangmu这个变量准确的说是忽略了项目前面的一个StaticDemo,因为这个是类变量由类直接调用 } void saySelfSecond() { System.out.print(name+"............."+a); } } class StaticDemoShow { public static void main(String[] args) { StaticDemo sd = new StaticDemo("static1",10); sd.saySelfSecond(); System.out.print(StaticDemo.xiangmu); StaticDemo.saySelf(); } }
那么我们就参照上面的例子画一个内存图来理解一下:
这样从上到下,我们的内存图就加载好了,只是有一点不明白,System.out.print这个需要进栈么?