静态变量与JVM内存分配
static修饰符的特点:
1.属于类不属于对象,随着所在类的加载而加载(当JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了)
2.优先于对象存在(对象是手动通过new创建出来的)
3.static修饰的成员被该类型的所有对象共享(根据该类创建处理的任何对象,都可以访问static成员)
4.直接使用类名访问static成员,也可以用对象访问
(表面上可以通过对象去访问static,编译后本质还是永类名访问的,和对象没有任何关系。)
类成员:使用static修饰的成员,属于类
实例成员:没有使用static修饰的成员,属于对象
在static方法中,只能调用static成员,不能调用非静态成员。(因为static修饰的随着类的加载而加载,所以类存在,静态的就存在了,但你想要去访问的非静态的东西还不存在。)
这个状态/行为属于整个事物(类),就直接使用static修饰,被所有对象共享。
往往把工具方法用static修饰。
如果不使用static修饰,则这些方法属于该类的对象,需要先创建对象再调用方法
工具对象只需要一份,但可能要创建N个对象来实例化类,显得麻烦且占内存
注意问题:
1.静态方法的调用不是通过实例对象进行的,所以它没有this指针。
2.子类不能重写父类的静态方法,可声明与父类静态方法相同的方法将父类静态方法覆盖。
class Person
{
String name;
int age;
//不属于某个对象,属于人类
static int total=5;
Person(String n,int a){
name=n;
age=a;
total++;
}
void die(){
System.out.println("去世");
total--;
}
static void destory(){
total=0;
System.out.println("人类毁灭");
}
}
class PersonDemo{
public static void main(String[]args){
System.out.println(Person.total);
Person p1=new Person("will",18);
Person p2=new Person("li",17);
System.out.println(Person.total);
System.out.println(p1.total);//这里用对象调用,其实底层还是在用类调用
System.out.println(p2.total);
p2.die();
System.out.println(Person.total);
Person.destory();
System.out.println(Person.total);
}
}
在内存中的情况:
可参考以下博客:
https://www.cnblogs.com/chenpi/p/5159558.html 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
https://blog.csdn.net/yangyuankp/article/details/7651251 Java内存分配全面浅析
版权声明:本文为ziyonghong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。