zoukankan      html  css  js  c++  java
  • 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一个。过运用==进行比较时实部相等的。

  • 相关阅读:
    通过数据库查看EBS的登录地址
    重启redis报错:Waiting for Redis to shutdown
    Tomcat8启动报there was insufficient free space available after evicting expired cache entries
    EBS安装过程报错,oracle.apps.fnd.txk.config.ProcessStateException: FileSys OS COMMAND Failed : Exit=2 See log for details.
    CentOS系统将UTC时间修改为CST时间
    Tomcat启动时报错,Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext
    LICEcap 录制Gif动画
    Java 8 Optional In Depth
    IntelliJ IDEA推荐插件
    Java 8 – Convert Map to LIST
  • 原文地址:https://www.cnblogs.com/dazhi151/p/11693563.html
Copyright © 2011-2022 走看看