目录
引言
对象实例化过程
方法区
类变量
类方法
Static修饰的限制
引言
在介绍static之前我们先来看下这段代码:
public class Test { public int a = 1; public static int b = 1; public static void main(String[] args) { Test test1 = new Test(); test1.a++; System.out.println(test1.a); test1.b++; System.out.println(test1.b); Test test2 = new Test(); test2.a++; System.out.println(test2.a); test2.b++; System.out.println(test2.b); } }
猜猜会输出什么?
答案揭晓:
我们明明创建了两个对象按道理结果应该是2222才对,但第四个数井变成了3,这就值得深究了。
对象实例化过程我们在主函数内创建了两个变量test1,test2。而test1、test2存储的是地址,所以test1、2也叫引用。test1引用了一个对象,test2也引用了一个对象,而这些对象中有啥呢,看下图:
他们有Test类下的name,a。这个通过类创建对象的过程就叫做实例化。可我们在Test类下定义的不是还有b吗,它到哪去了呢?
方法区在这个情况下,我们引入了一个新的区:方法区
1.存储代码片段
当一个类进行编译时产生了一个字节码文件通过类加载器加载到jvm的内存中,这时便会在方法区产生类的字节码文件。
2.存储静态的成员变量(也叫做类变量)。
我们看到静态变量只在方法区存储了一份,因此当我们通过对象使用它时,使用的是同一份,因此结果自然就是3了。
类变量静态变量也叫做类变量,因为他可以不用创建一个对象就能使用它。
示例:
我们直接用类名也能直接调用成功。
类方法既然有类变量那肯定有类方法了。
我们定义了一个简单的类方法实践下。
Static修饰的限制
1.普通方法内不能定义类变量
原因:1.static修饰的变量为类变量,属于类的
2.普通方法的调用需要new对象才能使用,而类变量不需要,假设能在普通方法内定义, 岂不是说可以直接调用普通方法而不需要new对象了。
2.类方法内不能定义类变量
原因:1.static修饰的变量为类变量,属于类的。
总结:静态的成员变量是不可以在方法内部定义的。
3.普通方法内可以调用类方法
原因:普通方法使用需要调用对象,而类方法不需要,因此可以调用。
4.类方法内不能调用普通方法
原因:普通方法调用需要new对象,而类方法不需要。
本文分享到这就结束了,感谢阅读!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)