荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: andyhua (海地), 信区: Java
标  题: java里成员初始化问题
发信站: 荔园晨风BBS站 (Fri Mar 14 15:25:04 2003), 站内信件

class xxx  {

    public static void main( String[] args ){
        xxx t = new xxx();
        String s;
        int i;
        System.out.println( s );//编译出错
        System.out.println(i);//编译出错
    }
}
-----------------------------------------------
class xxx  {
    String s;
    int i;
    public static void main( String[] args ){
        xxx t = new xxx();
        System.out.println(s);
        System.out.println(i);
    }
}
编译通过,输出结果null和0
-------------------------------------------

结论与相关问题:
1、method里面定义的成员必须初始化,而且初始化不能放在try块里,编译器不会为
你制定默认初值
2、但是class对于的成员则不同,对于基本数据类型会给一个默认的初值0,
(不包括boolean)除非你自行指定初值,对于class reference,会给出初值null,
表示不指向任何对象。
3、所有成员变量一定会在任何一个成员函数被调用前初始化(包括构造函数),顺序
为定义的先后顺序.对于static修饰的没什么不同
4、static成员的初始化发生在第一次生成该类的实例或者调用它时,如果不产生任
何实例或不调用它则永远不会被初始化,以后再生成不会再被初始化而普通的则在
每次生成新得实例时初始化
5、对于用static集中初始化的成员变量,被初始化的变量必须被声明为static
class xx {
        int i;
        static {
                i=5;//不允许,i必须被声明为staitc成员才允许这样初始化
        }
        //对于非static成员允许这样集中初始化
        //{
        //     i=5;...
        //}
        ...
}
这种用static集中初始化的,初始化动作也只被进行一次
6、数组的初始化:数组初始化完成后容量变确定了,不能再改变其容量,这一点不同
于c++
7、字类对象的初始化:会自动在构造函数前插入对父类无参数构造函数的调用
如果想调用父类有参数构造函数,必须自己手工写super.xx(...)

8很重要的问题:一个类何时被装载
类仅在被使用时才会被载入,首次运行时,不被用到的类不会被载入,这样减少了
系统开销
程序运行后的执行顺序:
开始使用某个类(非声明)->载入类->如果有父类载入父类,直到载入根类->执行
根类的静态初始化动作->执行子类的初始化动作直到当前类->所以必要的类被载入
后,便可开始产生对象了.


※ 修改:.andyhua 於 Mar 14 16:25:07 2003 修改本文.[FROM: 61.145.129.82]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店