• 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一个。过运用==进行比较时实部相等的。

  • 相关阅读:
    彻底理解cookie,session,token.md
    13Gin中使用jwt
    qstat f队列状态是au和s,如何恢复
    shell三剑客
    mysql根据俩个字段之差进行区间分组
    运行jnlp文件
    mount o后面参数含义
    Linux常用命令
    java VelocityEngine 属性key值得组成说明
    Linux 基本命令 sed
  • 原文地址:https://www.cnblogs.com/dazhi151/p/11693563.html
Copyright © 2020-2023  润新知