java各数据类型的变量的默认值
在java中,如果我们对变量不做初始化,变量具有什么默认值?
首先需要了解的是,在java中,局部变量是没有默认值的,所以在声明时,如果没有赋值,后面程序直接使用该变量,编译器会检查出错误。(包装类也是如此)。而成员变量作为类的成员,JVM会自动给他们赋初值。
局部变量不做初始化:可以看出如果不做初始化直接使用,会报错。
成员变量(类成员)不做初始化的默认值:
八种基本类型(byte short int long float double char boolean)
//结果
byte类型的默认值:0
short类型的默认值:0
int类型的默认值:0
long类型的默认值:0
float类型的默认值:0.0
double类型的默认值:0.0
char类型的默认值:
boolean类型的默认值:false
这里需要说明的是,char类型变量后面没有输出,这并不是char类型变量没有默认值,而是默认值为"空字符",即’\u0000’,数值为0
System.out.println(p.c=='\u0000');
输出为:true
true
包装类(Byte,Short,Integer,Long,Float,Double,Character)
Byte b;
Short s;
Integer i;
Long l;
Float f;
Double d;
Character c;
Boolean t;
public static void main(String[] args) {
Num_default p = new Num_default();
System.out.println("包装类");
System.out.println("Byte类型的默认值:"+p.b);
System.out.println("Short类型的默认值:"+p.s);
System.out.println("Integer类型的默认值:"+p.i);
System.out.println("Long类型的默认值:"+p.l);
System.out.println("Float类型的默认值:"+p.f);
System.out.println("Double类型的默认值:"+p.d);
System.out.println("Character类型的默认值:"+p.c);
System.out.println("Boolean类型的默认值:"+p.t);
}
输出全为:null
Byte类型的默认值:null
Short类型的默认值:null
Integer类型的默认值:null
Long类型的默认值:null
Float类型的默认值:null
Double类型的默认值:null
Character类型的默认值:null
Boolean类型的默认值:null
引用类型(String,数组)
int[] array;
String str;
public static void main(String[] args) {
Num_default p = new Num_default();
System.out.println(p.array);
System.out.println(p.str);
}
输出:
null
null
注意:如果数组使用new在堆上分配了空间,则数组就会获得默认值,即使数组为局部变量也是如此。
`` public static void main(String[] args) {
//局部变量数组
int[]int_array =new int[5];//声明整型数组
String[] atr_array = new String[5];//声明String类型数组
System.out.println(int_array[0]);
System.out.println(atr_array[0]);
}`
打印:
0
null
这里又突然想到还有静态成员变量(静态变量),但运行过后跟对应的基本数据类型默认值相同,
```java
静态byte类型的默认值:0
静态short类型的默认值:0
静态int类型的默认值:0
静态long类型的默认值:0
静态float类型的默认值:0.0
静态double类型的默认值:0.0
静态char类型的默认值:
静态boolean类型的默认值:false
静态变量不能声明在方法中:
可以看到提示 ‘static’ not allowed here(static不被允许在这儿)
另外,对于局部变量,包括protected,private,public这些也不能加,而全局变量是可以的,静态变量是定义在类中,方法体外面的,局部变量是保存在栈中的,而静态变量保存在方法区,局部变量出了方法就会被栈回收了,而静态变量不会,所以局部变量前不能加static关键字,同一时刻,只可能有一块栈内存被当前方法使用,用完了就回收了
总结:
实例变量(成员变量):有默认值;属于某个类的实例,实例变量在对象创建的时候创建,在对象被销毁的时候销毁;static块和方法不能直接调用它。
静态变量:它属于类,不能被声明在方法中,有默认值,静态变量在程序开始时创建,结束时销毁,可以用类名.变量名访问。
局部变量:在一个方法或者代码块内,没有默认值,第一次使用时,必须初始化
注意:对于数组, 如果使用new在堆上分配了空间,那么对应数组索引有默认值。