一.问题
随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一。
初始化和清理正是涉及安全的两个问题。
二.java 解决方案
构造器:一种特殊的方法。java 中”初始化“和”创建“捆绑在一起,两者不能分离。
垃圾回收器:释放无用的对象。
三.方法重载
为什么要在这里讲方法重载?我觉得首先:构造器是一种特殊的方法,再一个,构造器除了默认构造器还有有参构造器。为了让方法名称相同而形式参数不同的构造器同时存在,就必须用到方法重载。
区分方法重载的判决条件
1.参数的数量是否相同
2.参数的类型是否相同
只要其中一条为否,则就是方法重载,必须记住重载的前提:方法名称必须相同。
四.构造器中调用构造器
1.尽管可以用this调用一个构造器,但却不能调用两个。此外,必须将构造器调用置于最起始处,否则编译错误。
2.除构造器之外,编译器禁止在其他任何方法中调用构造器。
五.成员初始化途径
1.所有变量在使用前都能得到恰当的初始化,类的基本类型默认为基本类型的默认值,局部变量必须由编程者指定初始值,在类中,一个对象引用不将其初始化,就会获得特殊的null值。
2.编程者指定变量初始化值
3.通过构造器初始化变量值,但是自动初始化在构造器初始化之前完成。
六.变量初始化顺序
变量定义的顺序决定了初始化的顺序,即使变量定义散步于方法定义之间。
七.静态数据初始化
无论创建多少个对象,静态数据都只占用一份存储区域,static 关键字不能用于局部变量,因此只能作用于域。
八.非静态实例初始化
代码如下:
Class Mug{ Mug(int maker){ print("Mug("+maker+")"); } void f(int maker){ print("f("+maker+")"); } } public Class Mugs{ Mug mug1; Mug mug2; { mug1= new Mug(1); mug2= new Mug(2); print("mug1&mug2 initial"); } Mugs() { print("Mugs(int)"); } public static void main(String[] args) { print("Inside main()"); new Mugs(); print("new Mugs() completed"); new Mugs(1); print("new Mugs(1) completed"); } }
从输出结果可以看出,实例初始化子句是在两个构造器之前执行的。
九,对六七八的总结
1.首先初始化静态的变量(第一次访问.class文件时初始化,只初始化一次),然后初始化非静态变量
2.非静态变量会被创建对象时复制给默认值。
3.执行编程值为变量指定的初始值。
4.执行构造器。