您的位置:首页 > 编程语言 > Java开发

Java对象及内存管理

2015-06-08 09:36 239 查看

在同一个JVM内,每个类只对应一个Class对象,但每个类可以创建多个Java对象。

类中变量分为:实例变量和类变量。

类变量在分配内存时会在使用类时就开始分配内存,一个类的类变量只需一块内存空间,共享,第一次分配之后就不会在实例化对象时分配了;类每创建一次实例,就需要为实例分配一块内存空间。

(重点)类变量的内存空间分配以及赋初始值的步骤:一开始使用类时,先初始化类(实例对象肯定在有类之后),给类变量(静态变量)分配内存空间,这时没有赋值,系统会赋给默认值,如果类型是引用类型就赋值为null,如果类型是short,int,byte,long则赋值为0,float,double则为0.0,是char类型就赋值为‘\u0000’,是boolean类型就赋值为false。然后再按照源码的顺序给类变量赋初始值:一是定义类变量时指定初始值,二是静态初始化块中队类变量指定初始值。这两种方式的执行顺序与他们在源程序中的排列顺序相同。这个要非常清楚,因为一开始类变量的值为0或者null,在有些地方会出现错误,所以一定要清楚内存的分配,才能正确得到计算结果。

实例变量的内存空间分配以及赋初始值的步骤:在使用new分配内存空间时,会先给对象的变量和继承的变量在内存空间开辟一块空间,然后去调用最上面父类的构造方法,显示指定(super),则去找相对应参数的构造方法,在执行构造方法之前,会在内存空间分配变量的空间,然后赋值,这个步骤在每个父类中是一样的,最后一个是新建的这个对象的变量分配内存空间。 如果没有显示的调用,则它会去找父类默认的无参构造方法,之前还是给父类中的变量分配内存空间。变量分配内存空间的步骤和类变量的一样,先是开辟空间,赋空值,然后根据顺序赋初始值,可以按照以下3中方法赋值:一是:定义实例变量时指定初始值,二是:非静态初始化块中对实例变量指定初始值,三是:构造器中对实例变量指定初始值;其中第一和第二种方式比第三种方式更早执行,但第一和第二种方式的执行顺序与源码的执行顺序相同。

构造器只是负责对Java对象实例变量执行初始化,在执行构造器之前,对象所占的内存空间已经分配出来了,实例变量都分配了内存空间,存的值都默认是空值。

当this在构造器中时,this代表正在初始化的Java对象。

当变量的编译时类型和运行时类型不同时,通过该变量访问它引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定。但通过该变量调用它引用的对象的实例方法时,该方法行为将由它实际所引用的对象来决定。Java继承在处理成员变量和方法时是有区别的。

例如:class Derived extends Base

Base bs = new Derived();

bs.实例方法(), 则去Derived中找方法。

bs.实例变量,则去Base中找。

Derived dr = new Derived();

Base base = dr;

base.实例变量,则在Base中找。

子类从父类继承的变量,如果在子类中有相同名称的变量,则会将继承来的变量隐藏掉,访问时用super.加上变量的名称,如果是类变量,也可用类名+类变量名称。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: