面向对象的定义(JVM自动为定义的变量赋值)
-
对象类型都赋值为null
-
int赋值为0
-
double,float赋值为0.0
-
char赋值为空格
-
boolean赋值为false
public class Animal{
public static void main(String[] args) {Dog dog = new Dog();
dog.setFlag();
}
}class Dog{
boolean flag;
char a;
int b;
float f;
double d;
Integer s;
String str;public void setFlag(){
System.out.println(flag+":"+a+":"+b+":"+f+":"+d+":"+s+":"+str);
}}
false::0:0.0:0.0:null:null
程序执行的内存分析
java虚拟机的内存可以简单分为: 栈,堆,方法区
栈 stack
:
-
JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
-
描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(用于存放局部变量(基本数据类型和对象的引用对象)、操作数、方法出口等)
-
属于线程私有,不能实现线程间的共享
-
由系统自动分配,速度很快,是一个连续的内存空间,数据执行完毕后,立即被释放,节约内存空间
-
栈的存储特性是"先进后出,后进先出"
-
栈中的数据没有默认初始值,需要手动设置
堆 heap
:
-
用于存放对象地址(new 创建的对象)
-
JVM只有一个堆,被所有线程共享
-
堆是一个不连续的内存空间,分配灵活,速度慢,堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动释放
-
存放的实体是用来封装数据的,都有默认值
方法区 method area
:
-
JVM只有一个方法区,被所有线程共享
-
方法区实际也是堆,只是被用于存储类、常量相关的信息
-
用来存放程序中永远不变或唯一的内容(类信息Class对象、静态变量、字符串常量等)
以如下代码为例:
public class Animal { private String name; public static void main(String[] args) { int a = 10; int b = 20; Dog dog = new Dog(); dog. dog.info(); dog.bite(); } } class Dog{ private Integer age; private String name; public void info(){ int age = 20; System.out.println(name+"今年"+age+"岁"); } public void bite(){ System.out.println(name+"咬了人"); } }
代码的源程序存储在方法区中,当java 运行后,在方法区中找main函数,在执行dog.info()时,分配空间如图所示:
在栈中找age=20,如果栈中没有,则去dog指向的堆中找age的值,进行输出操作。执行完dog.info()后,该空间会被释放,调用dog.bite(),又在栈中分配空间: