黑马程序员技术交流社区
标题:
关于引用变量和基本变量的默认值问题
[打印本页]
作者:
何明辉
时间:
2012-8-8 22:50
标题:
关于引用变量和基本变量的默认值问题
class Index
{
String a1;
int b1;
}
class Demo
{
public static void main(String[] args)
{
String a2;
int b2;
Index p=new Index();
System.out.println(p.a1+"...."+p.b1);//程序显示的是null和0
System.out.println(a2+"...."+b2);//没有赋值,不能打印
}
}
上面的程序中中我知道a1和b1是对象的一建立就赋给默认值了,但是为什么java虚拟机在调用主函数的时候却没有给a2和b2赋默认值啊,有什么区别吗,
作者:
yb61776662
时间:
2012-8-8 23:18
类变量(类静态成员): 类被加载时产生;它的生存期是类的生存期;自动初始化(类被加载)
成员变量(类成员): 在使用new创建该类实例时产生;它的生存期与该类实例对象的生存期相同;
自动初始化(构造方法被调用)
局部变量(类的方法中的变量): 该方法被调用时产生; 在该方法退出后结束; 必须显式初始化
1 方法中的变量,不会被自动初始化。比如main方法中的变量index,定义如int index; 它不会被自动初始化。
2 当用new定义一些变量,会自动初始化,如 int [] d = new int[100]; 它自动初始化为0。
各数据类型的数组自动初始值如下:
byte 0
short 0
int 0
long 0l
float 0.0f
double 0.0d
char /u0000 即数值0,而非字符0,因为它是0~~65535的序列。字符0位置在48上,即/u0030
boolean false
reference null 如String
3 类成员如果没有被定义会自动获取一个初始值。首先运行声明的类成员,如果有定义,则取定义值,随后调用构造函数,如果构造函数中对已定义变量重赋值,则取重赋的值。
4 Stack类型自动初始化为空。空显示为[],而不是null。
举例:
class Test
{
static int myArg ;
public static void main(String[] args)
{
int myArg; //如果此行没有写,即可通过编译了。
System.out.pringln(myArg);
}
}
通不过编译。
5 数组定义
可以如下定义
int iArray[] = null;
6 静态块和类成员定义的优先级
//仍模糊,静态块,或代码块什么时候调用,是在类生成初么?那应该要比成员变量要早,因此,首先int i = 10;其次 i = 20;
如下:
public class Test
{
int i = 20;
static
{
int i = 10;
}
public static void main(String [] args)
{
Test a = new Test();
System.out.println(a.i);
}
}
运行结果:20 其中static中的i属于代码块。
7 关于局部变量和类成员之间的关系: 如果局部变量和类成员同名,那么该方法中认局部变量。
8 Boolean是引用类型和String类似吧,初始值为null;而boolean是基本类型,初始值为false。
作者:
尤洋
时间:
2012-8-8 23:49
本帖最后由 尤洋 于 2012-8-9 07:50 编辑
楼主的问题其实很简单,
初始化的过程是针对于
对象
而言的。
你的第一个例子中,由于 Index p=new Index();创建了对象,对象在 堆内存 中一出现 就会有默认初始化过程。所以显示为null和0
而第二个例子中,没有创建对象,局部变量在 栈内存 中等待赋值,自然就没有这个初始化过程。
想要了解的更详细,可以回顾一下 基础视频 day6,07节 对象的初始化过程。
作者:
黑马王冬冬
时间:
2012-8-8 23:54
1.主函数中的变量a2和b2同样是局部变量,需要程序员进行显式初始化。a1和b1是Index类中的成员变量。
2.成员变量无须显式初始化,系统会在类的准备阶段或创建该类的实例时进行默认初始化;局部变量除形参之外,都必须进行显式初始化。
3.如下是java中变量的结构图:
|实例Field(不以static修饰)
|成员变量=|
| |类Field(以static修饰)
|
所有变量===== |
| |形参(方法签名中定义的变量)
|局部变量=|方法局部变量(在方法内定义)
| |代码块局部变量(在代码块内定义)
作者:
牛杨
时间:
2012-8-9 01:44
在java中凡是存放到堆内存中的变量都要默认初始化值。因为类中成员变量是存放到堆内存中的,所以有默认初始化值,而函数中的局部变量,是存放在栈内存中的,所以就没有默认初始化过程,所以必须手动初始化。
作者:
牛杨
时间:
2012-8-9 01:44
在java中凡是存放到堆内存中的变量都要默认初始化值。因为类中成员变量是存放到堆内存中的,所以有默认初始化值,而函数中的局部变量,是存放在栈内存中的,所以就没有默认初始化过程,所以必须手动初始化。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2