24、对象及其内存管理

来源:互联网 发布:java 公钥加密 编辑:程序博客网 时间:2024/05/22 06:40
1、实例变量和类变量

        Java程序的变量大体可分为成员变量和局部变量。其中局部变量可分为:形参、方法内的局部变量、代码块内的局部变量。

实例变量的初始化时机:

(a) 定义实例变量时指定初始值;

(b) 非静态初始化块中对实例变量指定初始值;

(c) 构造器中对实例变量指定初始值。

类变量的初始化时机;

(a) 定义类变量时指定初始值;

(b) 静态初始化块中对类变量指定初始值。

2、父类构造器

        当创建任何Java对象时,程序总会先依次调用每个父类的非静态初始化块、构造器(总是从Object开始)执行初始化,然后才调用本类的非静态初始化块、构造器执行初始化。

2.1、隐式调用和显式调用

        调用父类构造器执行初始化方式如下:

(a) 子类构造器执行体的第一行代码使用super显式调用父类构造器,根据super调用时传入的实参列表来确定调用父类的哪个构造器;

(b) 子类构造器执行体的第一行代码使用this显式调用本类中重载的构造器,根据this调用时传入的实参列表来确定调用哪个构造器;

(c) 子类构造器执行体中既没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的构造器。

注意:super调用用于显式调用父类的构造器,this调用用于显式调用本类中另一个重载的构造器。super调用和this调用都只能在构造器中使用,而且super调用和this调用都必须作为构造器的第一行代码,因此构造器中的super调用和this调用最多只能使用其中之一,而且最多只能调用一次。

2.2、访问子类对象的实例变量

       子类能继承父类的成员变量的方法(非private)。

当变量的编译时类型和运行时类型不同时,通过该变量访问它引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定。但通过该变量调用它引用的对象的实例方法时,该方法行为将由它实际所引用的对象来决定。

2.3、调用被子类重写的方法

        如果父类的构造器调用了被子类重写的方法,且通过子类构造器来创建子类对象,调用(不管是显式还是隐式)了这个父类构造器,就会导致子类的重写方法在子类构造器的所有代码之前被执行,从而导致出现子类的重写方法访问不到子类的实例变量值的情形。

3、final修饰符

3.1、final修饰变量

被fianl修饰的实例变量必须显式指定初始值,而且只能在如下三个位置指定初始值:

(a) 定义final实例变量是指定初始值;

(b) 在非静态初始化块中为final实例变量指定初始值;

(c) 在构造器中为final实例变量指定初始值。

         对于普通的实例变量,Java程序可以对它执行默认的初始化,也就是将实例变量的值指定为默认的初始值0或null;但对于final实例变量,则必须由程序员显式指定初始值。

3.2、内部类中的局部变量

         如果程序需要在匿名内部类中使用局部变量,那么这个局部变量必须使用final修饰符修饰。

注意:不仅匿名内部类,即使是普通内部类,在任何内部类中访问的局部变量都应该使用final修饰。

0 0
原创粉丝点击