默认初始化:
局部变量,系统不会初始化,未初始化的话,会提示编译错误。
在类中的域,则是会自动初始化。
public class InitialValues {
boolean t;
char c;
byte b;
short s;
int j;
long l;
float f;
double d;
InitialValues reference;
void printInitialValues() {
System.out.println("Data Type Initial Value");
System.out.println("boolean " + t);
System.out.println("char " + c);
System.out.println("byte " + b );
System.out.println("int " + j );
System.out.println("long " + l );
System.out.println("float " + f );
System.out.println("double " + d );
System.out.println("InitialValues " + reference);
}
public static void main(String[] args) {
new InitialValues().printInitialValues();
}
}
output:
指定初始化:
手动赋值,在类的定义中。
构造器初始化:
先置0,后赋值
在类的内部,定义变量的先后顺序决定了初始化的顺序
package mete.data;
class Window {
Window(int marker) { System.out.println("Window(" + marker + ")"); }
}
class House {
Window w1 = new Window(1);
House() {
System.out.println("House()");
w3 = new Window(33);
}
Window w2 = new Window(2);
void f() { System.out.println("f()"); }
Window w3 = new Window(3);
}
public class OrderofInitialization {
public static void main(String[] args) {
House h = new House();
h.f();
}
}
output:
静态数据的初始化:
无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果是基本类型,默认置为标准初值,如果是对象,置为null。
package mete.data;
class Bowl {
Bowl(int marker) {
System.out.println("Bow1(" + marker + ")");
}
void f1(int marker) {
System.out.println("f1(" + marker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
}
public class StaticInitialization {
public static void main(String[] args) {
System.out.println("Creating new Cupboard in main.");
new Cupboard();
System.out.println("Creating new Cupboard in main.");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
output:
数组初始化:
数组只是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列,数组是通过方括号下标运算符来定义和使用的。
编译器不允许指定数组的大小,现在拥有的只是对数组的一个引用,而且也没有给数组对象本身分配任何空间。
在java中,可以将一个数组复制给另外一个数组,其实真正做的是复制了一个引用。
创建数组:
package mete.data;
import java.util.Arrays;
import java.util.Random;
public class ArrayNew {
public static void main(String[] args) {
int[] a;
Random rand = new Random(47);
a = new int[rand.nextInt(20)];
System.out.println("length of a is " + a.length);
System.out.println(Arrays.toString(a));
//Arrays.toString 方法属于java.util标准类库,它将产生一位数组的可打印版本。
}
}
output:
如果你创建了一个非基本类型的数组,那么你就创建了一个引用数组。
用花括号来创建数组(对比c语言)
package mete.data;
import java.util.Arrays;
public class ArrayInt {
public static void main(String[] args) {
Integer[] a = {1, 2, 3};
System.out.println(Arrays.toString(a));
}
}
output:
package mete.data;
import java.util.Arrays;
import java.util.Random;
public class ArrayClassObj {
public static void main(String[] args) {
Random rand = new Random(47);
Integer[] a = new Integer[rand.nextInt(20)];
System.out.println("length of a is " + a.length);
for(int i = 0 ; i < a.length; i++ )
a[i] = rand.nextInt(500);
System.out.println(Arrays.toString(a));
}
}
output: