动手动脑

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; // 访问实例成员
        }
    }
    

      通过创建实例对象。

 

posted @ 2023-10-01 14:59  *太¥^白%  阅读(131)  评论(0编辑  收藏  举报