java中的动手动脑

1.关于构造函数的问题

 

 

 为什么上面的代码不能通过编译?

因为当你没有定义构造函数时,java编译器在编译时会自动生成一个无参的构造函数,上面的代码就可以进行执行了。但是当你顶一个构造函数时,编译器将不会在自动生成一个无参的构造函数,所以上述代码不会通过编译。

2.静态初始化块的问题

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

    }
}
复制代码

运行结果:

 

 

编译顺序是,在构建子类对象时,先构建父类的对象,之后一次执行相应的静态语句块,然后依次执行相应的普通语句块和构造函数,当在子类中有super();时,分类的构造函数使用super();调用的父类构造函数。

4.关于诡异的Integer

关于Integer相应的问题。

public class StrangeIntegerBehavior 
{
    public static void main(String[] args)
    {
        Integer i1=100;
       
        Integer j1=100;
        
        System.out.println(i1==j1);

        
        Integer i2=129;
        
        Integer j2=129;
        
        System.out.println(i2==j2);
    
    }
}

输出的结果:

 

讨论的问题是,为什么最后输出的false。

因为当写入Integer x = yyy时,编译器其实会调用Integer x = Integer.valueOf(yyy)这样子来进行赋值。其当数字在-128~127时会进行缓存一次,加入使用了Integer  y=120;编译器会new一个,当再次使用Integer x = 120;时编译器还会使用原来的地址,不会再new一个,而就像上面写的当赋值为129时候,超出了对应的范围,当再次初始化为129时,就会重新new一个。过运用==进行比较时实部相等的。

posted @ 2019-10-17 17:36  喜欢爬的孩子  阅读(124)  评论(0编辑  收藏  举报