动手动脑及试验

Java字段初始化规律:

输出结果:100

             300

Java字段初始化规律:Java进行初始化的地方有两个,初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块(以上程序为实例初始化块)。静态初始化块是类中由static修饰的初始化块,实例初始化块为类中没有任何关键字修饰的初始化语句。执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个排在前面。当有两个构造函数时依据参数个数进行引用。

  动手动脑1

 源程序代码:

 

public class JiCheng {

public static void main(String[] args) {

     Son s= new Son();

      s.print();

         }

}

class Father{

        String name;

        int age;

  {

       name="mm";

       age=21;

          }

}

class Son extends Father{

          String like="football";

void print()

{

System.out.println("name:"+name+" age:"+age+" aihao"+like);

           }

 

}

结果截图:

 

 

                                 动手动脑2

请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

源程序代码:

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

         }

}

 

输出结果:

 

静态初始化块的执行顺序:静态初始化块总是比普通初始化块先执行。与普通初始化块类似的是,系统在类初始化阶段执行静态初始化块时,不仅会执行本类的静态初始化块,而且还会一直上溯到java.lang.Object,先执行java.lang.Object类中的静态初始化块,然后执行其父类的静态初始化块,最后才执行该类的静态初始化块。经过这个过程,才完成了该类的初始化过程。只有当类初始化完成后,才可以在系统中使用这个类,包括访问类method、类Field,或者用这个类来创建实例。

 

                               一个有趣的问题

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

源程序代码:

public class Test{ 

       int i =123;

       static int Temp;

 

public static void A()

{

        System.out.println(Temp);

}

public int B()

       int x = 100;

        return x; 

}

 

public static void main(String args[]) {

         Test e = new Test();

         Temp = e.B();

          e.A();

          }

}

结果截图:

原文地址:https://www.cnblogs.com/sunmei20142925/p/4887389.html