前言
如果看这篇时候看不懂,可以先看BZ前面的一篇文章,请点击这里。
内存
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
为了更清楚地搞明白发生在运行时数据区里的黑幕,我们来准备2个小道具(2个非常简单的小程序)。
BZ发现了一篇博文对堆、栈、方法区有很好的解释点击跳转。
static细节
类中
1.静态是随着类的加载就加载了,也是随着类的消失而消失了。
2.静态优于对象存在,被对象共享。
3.因为静态先存于内存中无法访问后来的对象的中的数据,所以
静态无法访问非静态。而且内部无法书写this.因为这时对象
有可能不存在,this 没有任何指向。
成员变量和静态变量
静态变量和成员变量的区别
1.所属范围不同。、
静态变量所属于类,成员变量所属对象。
静态变量也称为:类变量:成员变量也称为实例变量
2.调用不同。
静态变量可以被对象和类调用(一般都用类名调用)
成员变量只能被对象调用。
3.加载时期不同
静态变量随着类的加载而加载。
成员变量随着对象的加载而加载。
4.内存存储区域不同。
静态变量存储在方法区(数据共享区)中。
成员变量存储在堆内存中
了解内存,接下理我们就讲道理怎么个执行过程
class Circle{
private double radius;
pirvate static double pi = 3.14;
Cricle (double radius){
this.radius = radius;
}
double getArea(){
return radius*radius*pi;
}
static void show(){
System.out.println(“circle show run..”+pi);
}
}
class CircleDemo{
public static void main(String[] args){
Cricle c= new Circle(4);
c.getArea();
Circle.show();
}
}
运行命令
javac CircleDemo.java
java CircleDemo
- 当运行java CricleDemo时,就开始加载类
加载到方法区(静态区),class CircleDemo
class CircleDemo{
CircleDemo{} //构造方法
}
当加载到有静态方法和变量时
就又在方法区(数据共享区、静态区)创建了一个static空间
CircleDemo{
main(String[] args){}
} - 执行主函数(main),
执行主函数(main),
里面有new Circle(4);
再次先加载class Circle(有static的话,同上)
new 开辟空间,里面有 radius。(没有pi)