动手动脑
piblic class Text{
public static void main(String []args){
Foo obj1==new Foo();
}
}
class Foo{
int value;
public Foo(int initValue){
value=initValue;
}
}
以下代码为何无法通过编译?哪儿出错了?
首先是我们自己在类Foo里定义了一个构造方法,而这个构造方法是带参数的;如果我们不定义,电脑会自动定义一个无参数的,那在主函数里就可以那么写。
public class InitializeBlockDemo {
/**
* @param args
*/
public static void main(String[] args) {
InitializeBlockClass obj=new InitializeBlockClass();
System.out.println(obj.field);
obj=new InitializeBlockClass(300);
System.out.println(obj.field);
}
}
class InitializeBlockClass{
//下面这句在初始化块之前与之后,会影响到field字段的初始值
//public int field=100;
{
field=200;
}
public int field=100;
public InitializeBlockClass(int value){
this.field=value;
}
public InitializeBlockClass(){
}
}
下面是结果:

- 在创建对象时,成员变量会被初始化。
- 实例化对象的初始化顺序是:静态成员变量初始化 → 实例变量初始化 → 构造方法初始化。
- 如果成员变量没有被赋予初始值,则会使用默认值进行初始化。
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(); } } - 静态初始化块的执行顺序与它们在代码中的出现顺序一致。
- 静态初始化块在类加载时只会执行一次,且在静态成员变量初始化之后执行。
public class MyClass { private int count; public void instanceMethod() { // 非静态方法中可以直接访问实例成员 count = 10; staticMethod(this); // 将实例对象作为参数传递给静态方法 } public static void staticMethod(MyClass obj) { // 静态方法中通过参数访问实例成员 int count = obj.count; // ... } }通过参数传递实例对象。
-
public class MyClass { private int count; public static void staticMethod() { MyClass obj = new MyClass(); obj.count = 10; // 访问实例成员 } }通过创建实例对象。
浙公网安备 33010602011771号