TheFifthWeekText

类的构造方法是当创建对象时,对象自动调用的对对象进行初始化的方法。他没有返回值,而且构造方法名与类名是相同的。如果类中没有定义构造方法,Java编译器在编译时会自动给它提供一个没有参数的默认构造方法,但这个构造方法并不会对对象有所更改。然而当类中以后一个以上的构造函数之后,系统将不会再自动提供没有参数的默认构造方法,所以在以上的代码中,因为创建Foo类的对象时调用的构造函数的参数列表与Foo类的构造方法的形参列表不匹配,所以编译器提示错误。

 

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();

      

 

    }

}

执行结果:

Root的静态初始化块

Mid的静态初始化块

Leaf的静态初始化块

Root的普通初始化块

Root的无参数的构造器

Mid的普通初始化块

Mid的无参数的构造器

Mid的带参数构造器,其参数值:Java初始化顺序演示

Leaf的普通初始化块

执行Leaf的构造器

静态初始化模块的执行顺序:

1、  基类的静态初始化模块;

2、  子类的静态初始化模块;

3、  基类的普通初始化模块;

4、  基类的构造函数;

5、  子类的普通初始化模块;

6、  子类的构造函数;

Java字段初始化执行的规律

先看以下代码:

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=200;

    }

    public int field=100;

    public InitializeBlockClass(int value){

       this.field=value;

    }

    public InitializeBlockClass(){

      

    }

}

这段代码执行的结果为:

100

300

在以上的测试中,InitializeBlockDemo类中的静态main方法中定义了一个InitializeBlockClass类的对象obj,然后调用了InitializeBlockClass类的默认构造方法初始化obj,接着输出obj的属性field。输出结果是100,是initializeBlockClass的field属性声明时的默认值,并非字段初始化默认值。然后调用initializeBlockClass的带参数的构造函数初始化obj,输出结果为参数值。由此可见,在java类的对象初始化过程中,如果初始化的时候调用了带参数的构造函数,那么类对象的属性值以参数为准。如果调用的类无参数构造方法,那么对象的属性值以默认的值为准;如果没有默认值,则以默认字段为准。

静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

请看一下代码:

public class StaticTest {

 

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       System.out.println(str);

       StaticTest obj = new StaticTest();

       System.out.println(obj.str);

    }

    private static String str = new String("没有访问非静态字段");

    {

       str = "访问了非静态字段";

    }

}

由此可得出结论:在java类的静态方法中,若要访问该类的实例成员(即没有附加static关键字的字段或方法)需要实例化对象,用对象访问。

使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。

代码如下:

public class StaticTest {

 

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       Static a = new Static();

       Static b = new Static();

       Static.showCount();

    }

}

class Static{

    private static int count = 0;

    {

       count++;

    }

    public static void showCount(){

       System.out.println("一共生成了"+count+"个对象!");

    }

}

输出结果为:

一共生成了2个对象!

原文地址:https://www.cnblogs.com/maosonglin/p/5984191.html