静态变量与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);
	}
}

在内存中的情况:

静态变量与JVM内存分配_第1张图片

 

 

 

 

可参考以下博客:

https://www.cnblogs.com/chenpi/p/5159558.html   关于JAVA中的static方法、并发问题以及JAVA运行时内存模型

https://blog.csdn.net/yangyuankp/article/details/7651251  Java内存分配全面浅析

你可能感兴趣的:(静态变量与JVM内存分配)