A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

成员变量的声明时初始化和构造方法中初始化的区别是什么? 什么情况下用什么方式?

8 个回复

倒序浏览
问题看的有点晕,是指成员变量赋初值么?还是说成员变量和局部变量没分清楚,期待楼下解答
回复 使用道具 举报
声明时为成员变量赋值,那么你一创建对象,这个赋值就进行,而且先于构造器执行。
而且你每次创建这个类的对象,都是同一个值,比如你声明的时候写private int age = 18;,那么你每一个对象的age的值都是被初始成18.但是如果你把赋值语句写在构造器,
比如:constructor(int a){
age = a;}
那么你每次创建对象都可以单独为每一个对象赋值不同的age。比如你创建10个学生对象,他们的年龄不一定都是18啊,所以最好不要用声明时就赋值,最好写进构造器,为每一个对象赋不同的年龄。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
在构造函数中初始化。具有前瞻性。很好的考虑了项目未来的优化,维护。
例如:
这个类里面有一个属性String name ;代表了公司的名称。
如果你直接初始化 String name = "XXX公司";
那么如果以后公司换了名称,但是开发者离公司很远。
那么你势必要跑很远去那个公司重新安装。
而且你也要重新修改代码,重新编译。

如果是用构造函数初始化,这个公司的名称保存在一个文本文档里面。
那么你只需要让那个公司在对应的文本文档里面把名字修改了即可。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
成员变量初始化是随着类的加载而存在的,构造函数的初始化是建立对象后才有的,前者先存在,且存储在不同区域
回复 使用道具 举报
class demo
{
        private int x=10;
        demo(){};
        demo(int x)
        {
                this.x = x;
        }
        public int getX()
        {
                return x;
        }
}

class  Noname1
{
        public static void main(String[] args)
        {
                //当你创建对象时,类中的成员变量已经存在 值为初始化的值
                //demo de = new demo();
                //System.out.println(de.getX());
                //当你用构造函数时,像这样可以修改里面的值
                demo de = new demo(15);
                System.out.println(de.getX());
        }
}
回复 使用道具 举报
本帖最后由 段浩亮 于 2012-3-16 13:43 编辑

成员变量的初始化过程是这样的:
静态成员变量随着类的加载而建立
非静态成员变量随着对象的建立而建立,声明时初始化成为显示初始化,声明时不初始化,建立对象时系统会默认给它初始化(称为隐式初始化),数值型会默认初始化为0,字符默认是0在ASCII中对应的字符,boolean型默认为false,引用型默认为null   
成员变量的初始化过程是  隐式初始化----->显示初始化----->构造代码块初始化----->构造函数初始化,举一个简单的例子来说
class Person(
     String name = “lisi”;
     Person(String name){
          this.name = name;
     }
}
Person p = new Person(”zhangsan“);name在堆内存中值的变化过程是:null------->"lisi"------>"zhangsan"

详细的初始化过程请看我的日志http://duanhl207.blog.163.com/blog/static/204488036201221585718911/   黑马程序员_java中类的加载及初始化过程

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
成员变量初始化时,字符类型默认赋值为null,常量赋值为0;
构造函数初始化时,当对象一建立,就会调用与之对应的构造函数。
如果要创建多个对象,而且都有不同值时,一般不使用成员变量直接赋值。如:class Demo{int age=18;}这样创建一个对象,系统都会先给age默认赋值18,再赋值接收传进来的值。增加了系统赋值次数。

在构造函数中初始化是规范的,能很好的考虑了项目未来的优化和维护。
例如:
类里面有一个属性String name ;代表公司的名称。
如果你直接初始化 String name = "XXX公司";
那么如果以后公司换了名称,但是开发者离公司很远。
那么你势必要跑很远去那个公司重新安装。
而且你也要重新修改代码,重新编译。

如果是用构造函数初始化,这个公司的名称保存在一个文本文档里面。
那么你只需要让那个公司在对应的文本文档里面把名字修改了即可。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
张润政 黑马帝 2012-3-16 17:13:46
9#
成员变量的声明时初始化和构造方法中初始化的区别是什么? 什么情况下用什么方式?
我觉得楼上都说的很好了。补充一下我的意见吧。或者我的一点看法。
这两者的区别就是初始化的时间不同,最大的区别是在用法上的区别。这是两种思想,都是为了方便开发使用,没有真正的谁一定就有利有弊。这就要看具体需要了、
比如我们不需要在以后用到这个变量的时候,我们在函数声明的时候就给它一个固定的值,并且最好让他静态,让它final。这时候当类一加载进来它也就初始化完毕了,放在了专门的存储区。我们在后面的使用过程中是相当方便的。比如一些固定的字段,例如圆周率PI。
而当我们在以后使用到这个变量的时候我们需要再次给他赋值的时候,我们这时候可以选择在构造其中初始化,可以让我们来指定这个变量的值了。甚至还可以在其他函数中更改这个变量的值。比如上面举到的公司的例子。是吧,我们得根据具体的需要来采取具体的方法。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马