java成员变量默认赋值和初始化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java成员变量默认赋值和初始化相关的知识,希望对你有一定的参考价值。

当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,设置默认值,然后,为成员变量指定初始值。但是,如下所示:
class test
int a = b+1;
int b =1;
提示错误!
执行顺序不是大致可以认为是这样么:
int a = 0;
int b = 0;
a = b+1;
b = 1;
(感觉大致就是这样子吧)
如果是这样的话上边当int a = b+1时b应该已经有默认值了,但为什么报错啊?
表达有点乱,求大神解释!!!
创建类的实例时,系统自动分配内存空间,设置默认值,然后,为成员变量指定初始化(如果有的话)。
class test
int a;

像这样,在程序中实例化并输出会输出 a 为 0,因为默认值的问题,
如果像这样 class test
int a =1;

因为有初始化所以输出为a 为1。
总之当成员变量分配内存后,应该是有默认值的,顺序应该是:

int a;
int b;(这里应该都在分配内存时指定默认值为0了)
然后 再执行初始化:
a = b+1;
b = 1;
就这样子吧比如下面程序是对的
class

a = 1;

int a =2;

这次应该清楚点了吧!求解释!

参考技术A 程序的执行顺序是自上而下,当你使用b变量时 b变量还未定义。
另外设置默认值也不是0 c语言中是一个随机数, java中不太清楚。追问

这确实和c不一样,这是关于对象的,有点区别

追答

初始化不是你以为的顺序
初始化是从上而下。
初始化赋值会直接赋值
还没执行到b定义你就用怎么能不错。

参考技术B 你应该先定义 int b;
然后 int a=b+1;
int b=1;
这样a才会是1,你在使用a的时候根本没有定义b是什么呢怎么用,有可能b还是个数组呢,怎么直接做加法啊,是不是?追问

java 初始化话之前不是应该有默认值么?

追答

你定义的时候给变量加上static修饰词试试看,因为你定义的是成员变量的一种(分为实例变量和静态变量)实例变量,他不会随着类的加载就初始化给你加载上……你应该是认为程静态变量了吧……不明白的话可以继续追问……

追问

但是实例变量,依然是有默认值的,直接int a;不给他赋值,然后实例化输出的时候,a=0;他是有默认值得,他的默认值是在实例化的那个阶段给的啊?

追答

但是你根本没有初始化啊……
初始化必须给他个类型啊最少,不能直接写上个b就算是初始化 了,
成员变量能自动初始化的意思是,你写上 int b.他能给b一个初始值0,但是你都不写什么类型,怎么叫初始化呢……

参考技术C 上面的b你还没声明,就用了,,,,无语,,,语法不报错吗,,,追问

不是这样的,你在仔细看看亲,求解答啊

追答

你下边的那个a是在class里面的,上边的那个不是,具体我也不大清楚,,,

参考技术D int a = b+1的时候,b是什么?没有定义啊!倒过来试试!要么在a = b +1 之前 int b; int a = b +1 ; b =1;追问

我知道应该这样啊,但是按照分配内存和初始化 的顺序来说应该不会错啊?求解释!

追答

你的错误不在分配内存和初始化,在于违背了人家语言的规则!你这样子的写法,有些自然语言的以为,但是目前没有这么只能的语言,所以,我们要掌握一门语言,首先遵守人家的基本规则!

本回答被提问者采纳

请问java构造函数如何初始化成员变量的啊?

java构造函数如何初始化成员变量的方式如下:
初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。
参考技术A 可以直接赋值的,在构造里写只不过是为了方便,因为使用一个类的时候通常都要先new出该类的实例在构造里赋值,这样在new这个类的实例的时候成员变量就已经被初始化了。 参考技术B 例如成员变量 private int i;
你在构造函数里可以直接 i=100;或this.i=100;这样初始化。
参考技术C this.a = a;
this.b = b;
参考技术D new 对象的时候 给他赋值啊

以上是关于java成员变量默认赋值和初始化的主要内容,如果未能解决你的问题,请参考以下文章

java 中静态成员变量有没默认的初始值

java中证明成员变量有默认初始值

java成员变量怎么默认初始化

请问java构造函数如何初始化成员变量的啊?

Java成员变量和局部变量区别

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值