动手动脑
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; // 访问实例成员 } }
通过创建实例对象。