JAVA类与对象作业——动手动脑以及课后实验性问题

一:

1、源代码

//MAO2015.10.6

//foo

class Foo

{

    int value;

    public Foo(int initValue)

    {

        value = initValue;

    }

}

public class Test2

{

    public static void main(String[] args)

    {

        Foo obj1 = new Foo(2);

    }

}

2、截图

JAVA类与对象作业——动手动脑以及课后实验性问题

3、总结

如果一个类提供自定义的构造方法,导致系统不再提供默认构造方法。

二:

1、源代码

//mao2015.10.16

//初始化

class InitializeBlockClass

{

    {

        field = 200;

    }

    public int field = 100;

    public InitializeBlockClass(int value)

    {

        this.field = value;

    }

    public InitializeBlockClass()

    {

       

    }

}

public class Test3 {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        InitializeBlockClass obj = new  InitializeBlockClass();

        System.out.println(obj.field);

        obj = new InitializeBlockClass(300);

        System.out.println(obj.field);

    }

}

2、结果截图

JAVA类与对象作业——动手动脑以及课后实验性问题

3、总结Java字段初始化规律

首先执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。其次,执行类的构造函数

类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

三:

1、  源码

//mao2015.10.17

//静态初始化块的执行顺序

 

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

    }

}

2、结果

JAVA类与对象作业——动手动脑以及课后实验性问题

3、总结出“静态初始化块的执行顺序”

静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。

四:

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

请编写代码验证你的想法。

1、源码

//mao2015.10.17

//调用

class Use

{

    static int a = 1;

    int b = 2;

}

public class TestStatics {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        System.out.println(Use.a);

        //System.out.println(Use.b);报错

        Use use = new Use();

        System.out.println(use.b);

    }

}

2、结果

JAVA类与对象作业——动手动脑以及课后实验性问题

3、  结论

System.out.println(Use.a);

    //System.out.println(Use.b);报错

五:

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

1、源码

//mao2015.10.17

//跟踪某个类所创建对象的个数

class Count

{

    static int i = 0;

    public Count()

    {

        i++;

    }

    void getI()

    {

        System.out.println("已创建 "+i+"个");

    }

}

public class TestCount {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Count count = new Count();

        count.getI();

    }

 

}

2、结果

JAVA类与对象作业——动手动脑以及课后实验性问题

3、  总结

每创建一次,就会使用一次构造函数,所以用构造函数来计数。