动手动脑以及试验

1.动手动脑一

以下代码为何无法通过编译?哪儿出错了?

public class Test {

       public static void main(String[] args) {

              Foo obj1=new Foo();

       }

       class Foo{

              int value;

              public Foo(int initValue) {

                     value = initValue;

              }

       }

}

结论:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。所以调用类对象是应注意传参问题。

2.总结Java字段初始化的规律

代码:

public class InitializeBlockDemo {

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

             

       }

}

运行结果:

 

结论:执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”,按顺序执行,最后执行类的构造函数。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

3.动手动脑:静态初始化块的执行顺序

代码:

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

             

       }

}

运行结果:

 

结论:1.静态初始化块只执行一次。

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

4.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)? 请编写代码验证你的想法。

代码:

package Test;

public class Test

{

              int x = 3;

              static int y = 4;

              public static void Tests() {

                     System.out.println("实例变量x = " + new Test().x);

                     System.out.println("静态变量y = " + y);

              }

       public static void main(String[] args)

       {

              Test.Tests();

              Test t = new Test();

              System.out.println("x = " + t.x);

       }

}

程序运行结果:

猜你喜欢

转载自www.cnblogs.com/Lhxxx/p/11700311.html