对象及其内存管理

java 内存管理分为两个方面:内存分配和内存回收。

内存分配:建立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对象时都须要为实例变量分配内存空间,并对实例变量进行初始化。

从语法角度看,能够在三个地方对实例变量执行初始化

定义实例变量时指定初始值

非静态初始化代码块中对实例变量初始化

构造器中对实例变量指定初始值

相关文章
相关标签/搜索