Java进阶---对象与内存控制(一) (一)

2014-11-24 11:14:46 · 作者: · 浏览: 0

Java进阶---对象与内存控制(一)

Java提供了优秀的垃圾回收机制来回收已经分配的内存,但是这并不是意味着我们在编程程序的过程中,就可以肆无忌惮地挥霍Java程序的内存分配,这样做会造成程序的运行效率低下,直接影响程序的整体用户体验。

Java的内存管理机制分为内存分配和内存回收机制。内存分配机制在Java对象创建时为该对象在堆内存中分配指定的内存空间。内存回收指的是当该Java对象失去引用,变成垃圾时,内存回收机制会自动清理该对象,并回收该对象所占用的内存。

Java的内存回收机制由一条后台线程完成,本身也是非常消耗性能的,因此如果肆无忌惮地创建对象,让系统分配内存,那这些分配的内存都将由垃圾回收机制进行会回收,这样不但会使系统中可用内存减少,降低程序运行性能,而且使得垃圾回收的负担加重,降低程序的运行性能。

1、实例变量和类变量

Java程序的变量大体可分为成员变量和局部变量,局部变量可分为3类:

>形参:在方法签名中定义的局部变量,由方法调用者为其赋值,随方法的结束而消亡;

>方法内的局部变量:必须在方法内对其进行显示初始化,从初始化完成后开始生效,随方法的结束而消亡;

>代码块内的局部变量:必须在代码块内对其进行显示初始化,从初始化完成后开始生效,随代码块的结束而消亡。

由上可知,局部变量是指在方法签名、方法内和代码块内定义的变量。被存储在方法的栈内存中。

成员变量是指定义在类体内的变量,存储在类的栈中。如果定义该成员变量时没有使用static修饰,该成员变量又被称为非静态变量或实例变量,否则就被称为静态变量或类变量。

1)、实例变量和类变量的属性

类变量属于该类本身,而实例变量属于该类的实例。在同一个JVM内,每个类只对应一个Class对象,但每个类可以创建多个Java对象。

由于同一个JVM内每个类只对应一个Class对象,因此用一个JVM内的一个类的类变量只需一块内存空间;但对于实例变量而言,该类每创建一次实例,就需要为实例变量分配一块内存空间。也就是说程序中有几个实例,实例变量就需要几块内存空间。

通过下面的程序可以很好地理解实例变量和类变量:


[java]
class NoFive{
String name;
int id;
static int age;
public void output(){
System.out.println("姓名:" + name + ",学号:" + id);
}
}

public class test01 {
public static void main(String[] args) {
//类变量属于该类本身,只要该类初始化完成,程序即可使用类变量
NoFive.age = 22;
//通过类访问类变量
System.out.println("NoFive的年龄age是:" + NoFive.age);
NoFive noFive = new NoFive();
noFive.name = "小武灵灵";
noFive.id = 41009160;
noFive.age = 22;
//通过noFive访问NoFive类的age类变量
System.out.println("通过noFive变量访问age类变量:" + noFive.age);
noFive.output();
NoFive noFive2 = new NoFive();
noFive2.name = "灵灵小武";
noFive2.id = 6190014;
noFive2.age = 23;
noFive2.output();
//通过noFive2修改NoFive类的age类变量
noFive2.age = 21;
//分别通过noFive、noFive2和NoFive访问NoFive类的age类变量
System.out.println("通过noFive变量访问age类变量:" + noFive.age);
System.out.println("通过noFive2变量访问age类变量:" + noFive2.age);
System.out.println("通过NoFive类访问age类变量 :" + NoFive.age);

}
}

class NoFive{
String name;
int id;
static int age;
public void output(){
System.out.println("姓名:" + name + ",学号:" + id);
}
}

public class test01 {
public static void main(String[] args) {
//类变量属于该类本身,只要该类初始化完成,程序即可使用类变量
NoFive.age = 22;
//通过类访问类变量
System.out.println("NoFive的年龄age是:" + NoFive.age);
NoFive noFive = new NoFive();
noFive.name = "小武灵灵";
noFive.id = 41009160;
noFive.age = 22;
//通过noFive访问NoFive类的age类变量
System.out.println("通过noFive变量访问age类变量:" + noFive.age);
noFive.output();
NoFive noFive2 = new NoFive();
noFive2.name = "灵灵小武";
noFive2.id = 6190014;
noFive2.age = 23;
noFive2.output();
//通过noFive2修改NoFive类的age类变量
noFive2.age = 21;
//分别通过noFive、noFive2和NoFive访问NoFive类的age类变量