第三次课堂实验博文

1 、 java字段初始化的规律

运行的代码:

package 字段初始化;

class InitializeBlockClass

{

    //public int field=100; 放在初始化块的前后位置不同会导致输出的结果也截然不同;

   

    {

        field=200;

    }

    public int field=100;

    public InitializeBlockClass(int value)

    {

        this.field=value;

    }

    public InitializeBlockClass()

    {

       

    }

}

 

public class InitializeBlockClassDemo {

    public static void main(String[] args){

        InitializeBlockClass obj=new InitializeBlockClass();

        System.out.println(obj.field);

       

        obj=new InitializeBlockClass(300);

        System.out.println(obj.field);

       

    }

 

}

(1) 将public int field=100;放在初始化块之前的运行结果如图:

(2) 将 public int field=100;放在初始化块之后的运行结果如图:

 

因此可以得出结论:

Java字段初始化的规律是按顺序进行的,即字段初始化和局部变量初始化谁在后边以谁为准。

2、当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。静态方法可以继承,而且可以再子类中覆盖!静态块可以继承。

源程序:

package 继承;

 

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

      

 

    }

}

程序运行截图:

 

总结:

通过以上实验我们可以知道,父类的初始化快会随着子类对象的创建而被调用。父类的构造函数也会随着子类对象的创建而被调用。调用的顺序为,先调用静态初始化块,再调用初始化块,最后调用构造函数。在调用这三块的时候,又是按照先调用父类的再调用子类的顺序来完成的。

3静态方法访问非静态变量:

//建立一个类验证静态方法如何访问非静态变量

//范亚多 2015 10 16

 

package test;

 

public class TestStaticWay

{

    public static void main(String args[])

    {

       Second s = new Second();

       s.show();

    }

}

 

 

class Second

{

    int a;

    static void show()

    {

       Second m = new Second();

       System.out.println(m.a);

    }

}

运行结果截图:

 

 

 

总结:

在Java的语法里面,静态的方法是不能直接访问非静态的成员变量的,要想访问非静态的成员变量,只能是在方法体里面创建一个对象实例,即使用new关键字来创建一个对象实例,通过这个对象实例来完成对非静态成员变量的访问。

4、创建一个类,能够随时显示这个类当前的对象的个数

源代码:

package 类的对象个数;

//创建一个类,能够随时显示该类的对象的个数

//范亚多,2015,10,16

 

public class TestCreateNum

{

    static int num = 0;

    public TestCreateNum()

    {

        num++;

        System.out.println("当前该类的对象的个数为" + num + "个");

    }

   

    public static void main(String args[])

    {

        TestCreateNum t = new TestCreateNum();

    }

}

运行结果截图:

 

设计思想:

在类体里面创建一个静态常量num,用来记录对象的个数,初始值为0,然后在写一个构造函数,构造函数的语句为输出对象的个数和num++。构造函数是随着对象的创建而自动调用的,所以每创建一个对象就能显示出当前对象的个数。

 

 

:

 

 

 

 

posted @ 2015-10-17 23:23  范亚多  阅读(107)  评论(0编辑  收藏  举报