package test; public class Test{ public static void main(String[]agrs) { Foo obj1=new Foo(); } } class Foo{ int value; public Foo(int initValue) { value=initValue; } }
因为Test类构造了class Foo{}方法导致系统不再提供默认无参数的构造方法,然而此类并没有符合class foo的构造方法应该有参数的Foo obj1=new Foo(x);x是一个整数。
2.
package test; class InitializeBlockClass{ { field=200; } public int field=100; public InitializeBlockClass(int value) { this.field=value; } public InitializeBlockClass() { } public static void main(String[]agrs) { InitializeBlockClass obj=new InitializeBlockClass(); System.out.println(obj.field);//? obj=new InitializeBlockClass(300); System.out.println(obj.field);//? }}
输出的结果为100 300
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。 执行类的构造函数。
类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
3.
package test;
class Root{ static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root() { System.out.println("Root的无参数的构造器"); } } class Mid extends Root { static{ System.out.println("Mid的静态初始化块"); } { System.out.println("Mid的普通初始化块"); } public Mid() { System.out.println("Mid的无参数的构造器"); } public Mid(String msg) { //通过this调用同一类中重载的构造器 this(); System.out.println("Mid的带参数构造器,其参数值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的静态初始化块"); } { System.out.println("Leaf的普通初始化块"); } public Leaf() { //通过super调用父类中有一个字符串参数的构造器 super("Java初始化顺序演示"); System.out.println("执行Leaf的构造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }
输出结果:
静态初始化块只执行一次。 创建子类型的对象时,也会导致父类型的静态初始化块的执行。执行leaf()子类型也将Root的父类型也执行了
4.
package test; public class Test{ public int i=1; public static void main(String[]agrs) { Test s=new Test(); System.out.println("x="+s.i); } }
静态方法中访问类的实例成员时需要再静态方法中创建该类的对象,一次能访问类的实例成员。