关于类的一些思想

一:构造函数:

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Foo objl=new Foo();//应该改为:Foo objl=new Foo(家一个整数)

    }

}
class Foo{
    int value;
    public Foo(int initValue)
    {
        value=initValue;
    }
}

在定义objl的时候没有正确利用构造函数,构造函数有参数时,必须赋予初值。

二:类的成员的初始化

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Foo objl=new Foo();
        System.out.println(objl.value);
        Foo obj=new Foo(300);
        System.out.println(objl.value);

    }

}
class Foo{
    {
        value=200;
    }//初始化块
    public int value=100;//字段的初始化
    public Foo(int initValue)
    {
        this.value=initValue;
    }//构造函数
    public 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();
        

    }
}

运行结果为:

可以看出在类中静态初始块的顺序为:先调用静态初始块,其他初始化则是同时调用,静态初始化块只执行一次,创建子类型的对象时,也会导致父类型的静态初始化块的执行。

四:利用静态使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。

public class Chaxun {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Kehou m1=new Kehou();//定义1次
        Kehou m2=new Kehou();//定义2次
        Kehou m3=new Kehou();//定义3次

    }

}
class Kehou{
    static int a=0;
    public Kehou()
    {
        a++;
        System.out.println("你已经创建了"+a+"个对象");
    }//每定义一个对象就让a+1,就是定义的对象的个数
}

原文地址:https://www.cnblogs.com/zll20153246/p/5984817.html