黑马程序员技术交流社区

标题: 关于默认初始化值的一个小问题 [打印本页]

作者: 想飞的鱼    时间: 2014-9-10 23:02
标题: 关于默认初始化值的一个小问题
1,堆内存的特点之一是:堆内存中的变量都有默认初始化值。
2,数据类型分基本数据类型和引用数据类型,String类型是引用数据类型,字符串应该是一个对象。
3,对象应该存储在堆内存中。但是字符串是在堆内存中吗???(它也是一个常量,对于常量我不知道它应该在哪片内存)这一点我不清楚。如果它是在堆内存中,那么就应该有默认初始化值才对啊
4,代码比较
class Demo
{
        public static void main(String[] args)
        {
                String name;
                //System.out.println(name);//Demo.java:6: 错误: 可能尚未初始化变量name——为什么没有默认初始化null

                Person p = new Person();
                System.out.println(p.name);//默认初始化值:null
        }
}
class Person
{
        String name;
}


还望大家指点迷津,给讲讲字符串的知识。谢谢!

作者: 李春丽    时间: 2014-9-10 23:29
本帖最后由 李春丽 于 2014-9-10 23:31 编辑

class Demo
{
         public static void main(String[] args)
         {
                 String name; //这个 name 存在于栈内存中,需要初始化。
                 //System.out.println(name);//Demo.java:6: 错误: 可能尚未初始化变量name——为什么没有默认初始化null

                Person p = new Person(); //对象实例化
                 System.out.println(p.name);//默认初始化值:null
         }
}
class Person
{
         String name;//这个 name 是 Person 类中的常量,创建 Person 类对象时,才有这个常量,存在于堆内存中。
}

或许你可以这样理解: main 中的成员变量存在于栈内存中,必须要执行的代码。
而其他类中的成员变量,需要随着它所在的类的被调用而加载的,相较于 main 中的成员,创建有前提条件,故而存在于堆内存中。

作者: 想飞的鱼    时间: 2014-9-11 19:06
李春丽 发表于 2014-9-10 23:29
class Demo
{
         public static void main(String[] args)

哦了,第一个name在方法中,属于局部变量在栈内存,所以应该初始化,谢谢哥们!:)糊涂了~




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