zoukankan      html  css  js  c++  java
  • 动手动脑

    问题一:关于以下的代码为什么会产生错误的问题的简单分析、

    public class Test{

    public static void main(String[] args) {

           Foo obj1=new Foo();

    }

    }

    class Foo{

          int value;

          public Foo(int initValue) {

    value=initValue;

    }

    }

     

    第一个动手动脑提供了一下的代码,可以发现,在Foo的这个类中只定义了一个Foo(int)类型的构造函数,在之前的学习工程中,我们并没有接触到java的构造函数的声明过程,因此,在类中没有书写构造函数的方法的时候,编译器默认继承Object类,并在编译的时候会产生一个参数为空的构造函数,然而在定义的Foo这个类的时候,给予了一个Foo(int)类型的构造方法,所以在上述Test的调用过程中,obj1并不能够调用到new 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();

            

        }

    }

    运行结果如下:

     

    通过上面的实验可以看到,调用一个类的构造方法,会首先从最开始的子类往基类方向执行,并且最开始的执行的初始化块总是静态的,并且在执行完静态的初始化块之后,又从子类开始按普通,无参,有参的顺序开始往基类方向执行。

    问题三:

     

     

     题目要求根据以上的代码,及其下面所提供的代码,测试实验并得出结论。

     

    得到代码:

    package firsttest;

    public class Test

    {

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

        {

        }

    }

    运行结果如下:

     

    通过结果可以得出以下的结论:

    当存在初始化块和初始化值的时候,初始化值是变量最终的结果。

    当初始化块,初始化值,还有一个构造函数可以设置变量的值的时候,构造函数中的值将是变量的值。

  • 相关阅读:
    JMeter学习(八)JDBC Request
    linearLayout 和 relativeLayout的属性区别
    Android基础类之BaseAdapter
    Android LayoutInflater详解
    ASP.NET数据库连接字符串的加密与解密
    C#中web.config文件详解
    sealed,new,virtual,abstract与override关键字的区别?
    jQuery $.post $.ajax用法
    2009-04-19 22:40 SQL SERVER游标的讲解
    触发器 (Delete Update)
  • 原文地址:https://www.cnblogs.com/990906lhc/p/9826485.html
Copyright © 2011-2022 走看看