Java 初始化
一.static 初始化
static 成员初始化顺序
package object;
class Bowl {
Bowl(int marker)
{
System.out.printf("Bowl("+marker+")\n");
}
void f1(int marker)
{
System.out.printf("f1("+marker+")\n");
}
}
class Table{
static Bowl bowl1 =new Bowl(1);
Table()
{
System.out.println("table()");
}
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.print("Cupboard\n");
bowl4.f1(2);
}
void f3(int marker)
{
System.out.println("f3("+marker+")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization{
public static void main(String args[])
{
System.out.println("Creating new Cupboard() in main");
new Cupboard(); //静态成员只有在第一个Cupboard在创建时才会初始化,此后,静态成员不会再次初始化
System.out.println("Creating new Cupboard() in main");
Cupboard cupboard = new Cupboard();
new Table().f2(1);
new Cupboard().f3(1);
}
}/* output:
Creating new Cupboard() in main
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard
f1(2)
Bowl(1)
Bowl(2)
table()
f2(1)
Bowl(3)
Cupboard
f1(2)
f3(1)
*///~
显示的初始化静态方法
package object;
//: initialization/ExplicitStatic.java
import static net.mindview.util.Print.*;
class Cup
{
Cup(int marker)
{
print("Cup("+ marker +")");
}
void f(int marker)
{
print("f("+marker+")");
}
}
class Cups
{
static Cup cup1;
static Cup cup2; //静态域
static{
cup1 = new Cup(1);
cup2 = new Cup(2);
} //静态块
Cups()
{
print("Cups()");
}
}
public class ExplicitStatic{
public static void main(String args[])
{
print("Inside main()");
Cups.cup1.f(99); // (1) 无论时通过(1)还是注释掉(1)运行(2),Cups的静态初始化都会执行
// 静态初始化只会执行一次,如果(1)(2)全部注释掉则不会执行初始化
}
//static Cups cups1 = new Cups(); //(2)
//static Cups cups2 = new Cups(); //(2)
}/* output:
Inside main()
Cup(1)
Cup(2)
f(99)
*///~
二.非静态实例的初始化
package object; import static net.mindview.util.Print.*; class Mug { Mug(int marker) { print("mug("+ marker + ")"); } void f( int marker) { print("f("+marker +")"); } } public class Mugs{ Mug mug1; Mug mug2; { mug1 = new Mug(1); mug2 = new Mug(2); print("mug1 & mug2 initialized"); } //实例初始化子句是再构造器之前执行的 Mugs() { print("MUgs()"); } Mugs(int i){ print("Mugs(int)"); } public static void main(String args[]) { print("Instde main()"); new Mugs(); print("new Musg() cmopleted"); new Mugs(1); print("new Mugs(1) completed"); } }/* output: Instde main() mug(1) mug(2) mug1 & mug2 initialized MUgs() new Musg() cmopleted mug(1) mug(2) mug1 & mug2 initialized Mugs(int) new Mugs(1) completed *///~
三.数组的初始化
package object; import static net.mindview.util.Print.*; import java.util.*; public class ArrayNew{ public static void main(String args[]){ int [] a; Random rand = new Random(47); a = new int[rand.nextInt(20)]; print("length of a = " + a.length); print(Arrays.toString(a)); //Arrays.toString 产生一维数组的打印版本 } }/* output: length of a = 18 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]//数组元素会自动初始化为空值(对于数字和字符就是0,对于boolean是false) *///~
引用数组的初始化
package object; import static net.mindview.util.Print.*; import java.util.*; public class ArrayNew{ public static void main(String args[]){ Random rand = new Random(47); Integer [] a = new Integer[rand.nextInt(20)]; print("length of a = " + a.length); //for(int i = 0;i<a.length;i++) //a[i] = rand.nextInt(500); print(Arrays.toString(a)); } } /*如果创建一个非基本类型的数组,那么就创建了一个引用数组,直到把对象赋值给引用初始化才算完成 /**length of a = 18 [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] *///~
用花括号初始化对象数组
package object; import static net.mindview.util.Print.*; import java.util.*; public class ArrayNew{ public static void main(String args[]){ Integer[] a={ new Integer(1), new Integer(2), 3,//Autoboxing }; Integer[] b= new Integer[]{ new Integer(1), new Integer(2), 3,//Autoboxing 最后一个逗号是可选的 }; System.out.println(Arrays.toString(a)); System.out.println(Arrays.toString(b)); } }/*output: [1, 2, 3] [1, 2, 3] *///~
package object; import static net.mindview.util.Print.*; import java.util.*; public class ArrayNew{ public static void main(String[] args) { Other.main(new String[]{ "fiddle", "de", "dum"});//传递给other ,用来替换命令行参数 } } class Other{ public static void main(String[] args) { for(String s : args) System.out.print(s + " "); } } /* output: fiddle de dum *///~
可变参数列表 旧版
package object; //: object/VarArgs.java /**这是Java SE5 之前的代码 class A {} public class VarArgs { static void printArray(Object[] args) //所有类都间接或直接继承自Object类 { for(Object obj : args) System.out.print(obj + " "); System.out.println(); } public static void main(String args[]) { printArray(new Object[]{ new Integer(47), new Float(3.14), new Double(11.11) }); printArray(new Object[]{"one", "two", "three"}); printArray(new Object[]{new A(),new A(), new A()});//未赋值默认打印类名和地址 } }/* output: 47 3.14 11.11 one two three object.A@41975e01 object.A@c2e1f26 object.A@dcf3e99 *///~
可变参数列表 新版
package object; /** this is new code * */ class A {} public class NewVarArgs { static void printArray(Object... args) //这里的Object 可以换成String Integer Character int char 等其它类型 { for(Object obj : args) System.out.print(obj + " "); System.out.println(); } public static void main(String args[]) { //can take individual elements: printArray(new Object[]{ new Integer(47), new Float(3.14), new Double(11.11) }); printArray(new Object[]{"one", "two", "three"}); printArray(new Object[]{new A(),new A(), new A()});//未赋值默认打印类名和地址 // or an array printArray((Object[])new Integer[]{1,2,3,4}); //因为Integer[] 已经是数组,所以不会执行任何转换 printArray();//Empty list is ok } }/* output: 447 3.14 11.11 one two three object.A@41975e01 object.A@c2e1f26 object.A@dcf3e99 1 2 3 4 *///~
以下是初始化的三种情况:
package object; //: reusing/Bath.java // commposition for code reuse class Soap { private String s; Soap() { System.out.println("Soap()"); s = "Constructed"; } public String toString(){return s;} } public class Bath{ private String //initializing at point of definition s1 = "Happy", //在定义对象的地方初始化 s2 = "Happy", s3,s4; private Soap castille; private int i; private float toy; public Bath() //在类的构造器中初始化 { System.out.println("Inside Bath()"); s3 = "joy"; toy = 3.14f; castille = new Soap(); } //Instance initialization {i=47;} //实例初始化 public String toString(){ if(s4 == null) //在使用之前 s4 = "joy"; return "s1 = " + s1 + "\n"+ "s2 = " + s2 + "\n"+ "s3 = " + s3 + "\n"+ "s4 = " + s4 + "\n"+ "i = " + i + "\n"+ "toy = " + toy + " " + "castille = " + castille; //在这里编译器知道你要将一个String对象("source =") //同WaterSource相加 } public static void main(String[] args) { Bath bath = new Bath(); System.out.println(bath);//当只有一个对象时会自动调用toString() } }/* output: Inside Bath() Soap() s1 = Happy s2 = Happy s3 = joy s4 = joy i = 47 toy = 3.14 castille = Constructed *///~