码迷,mamicode.com
首页 > 编程语言 > 详细

java学习——关于java课件上动手动脑问题简单的分析

时间:2018-10-21 12:13:37      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:不能   产生   分享图片   实验   并且   height   题目   out   数值   

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

技术分享图片

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

问题二:技术分享图片

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

    }
}

其运行结果如下所示:

技术分享图片

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

问题三:技术分享图片

 

技术分享图片

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

技术分享图片

 

 

综合上面的代码:

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

}

得出以下的测试结果。

技术分享图片

 

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

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

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

 

java学习——关于java课件上动手动脑问题简单的分析

标签:不能   产生   分享图片   实验   并且   height   题目   out   数值   

原文地址:https://www.cnblogs.com/halone/p/9824387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!