黑马程序员技术交流社区

标题: 关于默认初始化的的问题,阿亮老师说下周讲,我等不及了 [打印本页]

作者: JARVIS_YJ    时间: 2015-3-28 22:47
标题: 关于默认初始化的的问题,阿亮老师说下周讲,我等不及了
/**
源码1 在类中方法外定义成员变量,还有在show方法中定义局部变量,在main函数中创建一个对象
*/
class Demo
{
        int i;
        String st;
        char c;        //'\u0000'(null)
        byte by;        //0(byte 1字节)
        short sh;        //0(short 2字节)
        long l;        //0L
        float f;//0.0f
        double d;        //o.od
        boolean        b;//false
        void show()
        {
                int i1;
                String st1;
                char c1;        //'\u0000'(null)
                byte by1;        //0(byte 1字节)
                short sh1;        //0(short 2字节)
                long l1;        //0L
                float f1;//0.0f
                double d1;        //o.od
                boolean        b1;//false
                System.out.print(i1+":"+st1+":"+c1+":"+by1+":"+sh1+":"+l1+":"+f1+":"+d1+":"+b1);
        }
}
class Test
{
        public static void main(String[] args)
        {
                Demo d=new Demo();
                System.out.println(d.i+":"+d.st+":"+d.c+":"+d.by+":"+d.sh+":"+d.l+":"+d.f+":"+d.d+":"+d.b);
        }
}
编译后发现定义在方法中的局部变量没有初始化


现在将局部变量注释掉,重新编译,
/**
源码2 在类中方法外定义成员变量,在main函数中创建一个对象
*/
class Demo
{
        int i;
        String st;
        char c;        //'\u0000'(null)
        byte by;        //0(byte 1字节)
        short sh;        //0(short 2字节)
        long l;        //0L
        float f;//0.0f
        double d;        //o.od
        boolean        b;//false
}
class Test
{
        public static void main(String[] args)
        {
                Demo d=new Demo();
                System.out.println(d.i+":"+d.st+":"+d.c+":"+d.by+":"+d.sh+":"+d.l+":"+d.f+":"+d.d+":"+d.b);
        }
}
运行发现默认初始化值int--0;String--null;char--'\u0000';byte--0;short--0;long--0;float--0.0;double--0.0;boolean--false;

现在将show方法中输出成员变量,主方法中定义变量输出
/**
源码3 在类中方法外定义成员变量,在show中输出成员变量,在main函数中定义变量并输出。
*/
class Demo
{
        int i;
        String st;
        char c;        //'\u0000'(null)
        byte by;        //0(byte 1字节)
        short sh;        //0(short 2字节)
        long l;        //0L
        float f;//0.0f
        double d;        //o.od
        boolean        b;//false
        void show()
        {
               
                System.out.print(i+":"+st+":"+c+":"+by+":"+sh+":"+l+":"+f+":"+d+":"+b);
        }
}
class Test
{
        public static void main(String[] args)
        {
                int a;
                Demo d=new Demo();
                d.show();
                System.out.println(a);
        }
}
编译后发现

将main方法中变量去掉
/**
源码4 在类中方法外定义成员变量,在show中输出成员变,说明成员变量在整个类中有用
*/
class Demo
{
        int i;
        String st;
        char c;        //'\u0000'(null)
        byte by;        //0(byte 1字节)
        short sh;        //0(short 2字节)
        long l;        //0L
        float f;//0.0f
        double d;        //o.od
        boolean        b;//false
        void show()
        {
               
                System.out.print(i+":"+st+":"+c+":"+by+":"+sh+":"+l+":"+f+":"+d+":"+b);
        }
}
class Test
{
        public static void main(String[] args)
        {
                Demo d=new Demo();
                d.show();
        }
}
运行结果:说明成员变量能够作用整个类兵器额初始化



/*******************************************/
反思:java的这种机制避免了没有被初始化的数据成员在进行其它操作时引起的严重性错误,尽量从语法上避免程序员犯错。(网上的答案)还有static定义的变量也能够自动默认初始化。求大神解释一下为什么成员变量是能够默认自动初始化的,谢谢!

1.png (200.03 KB, 下载次数: 18)

编译后报错未初始化

编译后报错未初始化

2.png (3.22 KB, 下载次数: 25)

2.png

3.png (5.65 KB, 下载次数: 19)

3.png

4.png (4.53 KB, 下载次数: 28)

成员变量作用于整个类

成员变量作用于整个类

作者: 李大大    时间: 2015-3-28 22:53
阿亮老师是亮哥么?
作者: fantacyleo    时间: 2015-3-28 22:59
楼主不是已经自己把答案写出来了吗:
java的这种机制避免了没有被初始化的数据成员在进行其它操作时引起的严重性错误,尽量从语法上避免程序员犯错。(网上的答案)还有static定义的变量也能够自动默认初始化。
作者: JARVIS_YJ    时间: 2015-3-28 23:30
fantacyleo 发表于 2015-3-28 22:59
楼主不是已经自己把答案写出来了吗:
java的这种机制避免了没有被初始化的数据成员在进行其它操作时引起的 ...

还没熟悉,现在还不是特别的理解。
作者: JARVIS_YJ    时间: 2015-3-28 23:32
李大大 发表于 2015-3-28 22:53
阿亮老师是亮哥么?

嗯。。。。。。。。。。。。
作者: 小亮smile    时间: 2015-3-31 21:53
非常好 !!!长见识了 !!赞一个

作者: 齐小灰同学    时间: 2015-3-31 22:10
我来。成员变量的生命周期是跟随着对象来的。当对象在堆内存中产生,成员变量也就产生了。内存为这个对象开辟出了一个空间,成员变量是这个对象的成员,内存会动态给成员变量赋值。如果一开始你就给成员变量赋值了,在这个之前也有一次默认的初始化。这是堆内存的特性吧。
作者: Mr.Kaizhei    时间: 2015-3-31 22:11
没看懂………………:'(
作者: 乐生    时间: 2015-3-31 22:14
赞了!!!
作者: xiaogougou    时间: 2015-3-31 22:18
fantacyleo 发表于 2015-3-28 22:59
楼主不是已经自己把答案写出来了吗:
java的这种机制避免了没有被初始化的数据成员在进行其它操作时引起的 ...

是的。。。
作者: lf027    时间: 2015-3-31 22:19
7楼讲的挺好




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2