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.加上变量的名称,如果是类变量,也可用类名+类变量名称。
在同一个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.加上变量的名称,如果是类变量,也可用类名+类变量名称。
相关文章推荐
- Eclipse for Mac 常用快捷键
- myeclipse如何切换用户
- JAVA 变量
- JAVA 面向对象
- java中,什么是GC?GC的基本原理。
- 判断二叉树是否平衡java
- 配置jdk 环境变量
- Java中的String类常量池详解
- java读取word目录
- Java 多线程
- struts2中的modelDriven机制
- java将pdf按页转换为图片
- java 利用jacob.jar将word转pdf
- java动态加载指定的类或者jar包反射调用其方法
- 如何手动获取myEclipse注册码:MyEclipse Trial Expired
- 在java中,如何跳出当前的多重循环?
- java作用域public protected private,以及不写时的区别
- 【j2ee spring】29、巴巴运动网-整合hibernate4+spring4(4)DAO层
- java基础笔记2
- 【j2ee spring】28、巴巴运动网-整合hibernate4+spring4(3)使用注解