内存分配:建立java对象时JVM为 该对象在对内存中分配的内存空间。java
内存回收:java对象失去引用,变成垃圾时,jvm的垃圾回收会自动清理该对象,并回收该对象所占用的内存。jvm
jvm的垃圾回收机制是后台有一条线程完成,消耗内存。性能
不断分配内存使系统中可用的内存减小,从而下降了程序的运行性能。spa
大量已分配的内存回收是的垃圾回收的负担加剧,下降程序的运行性能。线程
变量大致分为两类:成员变量和局部变量。对象
局部变量分为三类:接口
形参:参数方法签名中定义的局部变量,有方法调用者为其赋值,随方法的结束而消亡 内存
如:作用域
public String getUserName(User user){get
return user.getName;
}user对象就是形参
方法内的局部变量:在方法内定义的局部变量,必须在方法内对其进行显示初始化。 这种类型的局部变量从初始化完成后开始生效,随方法的结束而消亡。
如:
public int getAge(){
int age = 22;
return age;
}age 就是方法内的局部变量,随方法的结束而消亡。
代码块内的局部变量:在代码块内定义的局部变量,必须在代码块内对其进行显示初始化,这种类型的局部变量从初始化完成后开始生效,随代码块的结束而结束。
如:
public static void main(String args[]) {
{
int x = 30;
}
int x = 100;
System.out.println(x);
}
能够正常输出。可是交换位置后 以下:
public static void main(String args[]) {
int x = 100;
{
int x = 30;
}
System.out.println(x);
}
程序会报错。
第一种写法:先定义了代码块局部变量后定义方法局部变量,代码块局部变量x只能做用于定义它的代码块,也就是说出了代码块该x就被销毁了,因此后来再定义一个方法局部变量是能够的。
第二种写法:先定义了方法局部变量后定义了代码块局部变量,方法局部变量的做用域是整个方法,出了该方法后这个方法局部变量才被销毁,此例中,在方法局部变量还未被销毁时就定义了相同名字的代码块局部变量,因此被视为重复定义。
在定义域中定义的变量只可用于做用域结束以前。
局部变脸的做用时间很短暂,它们都被存放在栈内存中。
类体内定义的变量称为成员变量。若是定义该成员变量时没有使用static 关键字 修饰,该成员变量又被称为非静态变量或实例变量;若是使用了static修饰,则该成员变量又被称为静态变量或类变量。
static是静态的意思,就是一个标志,用于将实例成员变量变成类变量。static只能修饰在类里定义的成员变量,包括成员方法,变量,内部类(枚举和接口),初始化块。
static只能修饰类里面的成员,不能修饰外部类,不能修饰局部变量,局部内部类。
java 类中定义的成员变量是有前后顺序的,定义成员变量时必须采用合法的前向引用。
public class Show{
int num1 = num2 +1;
int num2 = 1;
}
程序会报错。程序是从上往下走的, num1,num2 都是成员变量。num1 须要引用num2, 而num2 还未声明。
再如:
public class Show{
static int num1 = num2 +1;
static int num2 = 1;
}
程序一样会报错,程序是从上往下走的,num1 num2都是类变量,在类Show 初始化的时候初始化,num1 引用num2 num2 还未赋值。 非法前向引用。
以下就能够。
public class Show{
int num1 = num2 +1;
static num2 = 1;
}
程序能够正常运行,num2是类变量,随着类Show的初始化而初始化,而num1 是实例变量,实例变量随对象的初始化而初始化。num1 必须等到建立Show对象时才会初始化,num2 初始化老是在num1以前。
static修饰的类变量属于类自己。没有static修饰的成员变量是实例变量,属于该类的实例。在同一个jvm内,每一个类只对应一个class 对象,可是每一个类能够建立多个java对象。jvm内每个类只对应一个class 对象,所以同一个jvm 内的一个类的类变量只须要一块内存空间,但对于实例变量来讲,该类每建立一次实例,就须要为实例变量分配一块内存。程序有几个该类实例,就要分配几块内存空间。
从程序运行角度看,每次程序建立Java对象时都须要为实例变量分配内存空间,并对实例变量进行初始化。
从语法角度看,能够在三个地方对实例变量执行初始化
定义实例变量时指定初始值
非静态初始化代码块中对实例变量初始化
构造器中对实例变量指定初始值