• 动手动脑感想


    1.动手动脑:以下代码为什么无法通过编译?哪出错了?

    public class Test{
     public static void main(String[] args){
      Foo obj1=new Foo();
     }
    class Foo{
     int value;
     public Foo(int initValue){
      value=initValue;
     }
    }

    obj1初始化出错,因为Foo类定义的含参的构造函数,不会自动生成无参构造函数,所以初始化错误。

    2.“自找麻烦”

    class InitializeBlockClass{
      {
        field=200;
      }
      public int field=100;
      public InitializeBlockClass(int value){
        this.field=value;
      }
      public InitializeBlockClass(){
      }
      public static void main(String[] args){
      InitializeBlockClass obj=new InitializeBlockClass();
      System.out.println(obj.field);
      obj=new InitializeBlockClass(300);
      System.out.println(obj.field);
    }

    运行结果:100    300

    规律:初始化块和字段的初始值谁在前面,先执行谁,构造函数最后执行。

    3.静态初始化块的执行顺序

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

    执行结果:

    执行顺序为,由父类到子类先执行静态初始化块,而后是普通,无参数含参构造器。

    4.如何在静态方法中访问类的实例成员

    package 实例成员;
    
    public class Num {
      public int i=3;
      public static void main(String []args) {
        Num j=new Num();
        System.out.println(j.i);
      }
    }

    运行结果:3

     在静态方法中定义类的对象,这样就可以调用实例成员了。

  • 相关阅读:
    恶意代码分析实战-确认EXE什么时候编译的
    恶意代码分析-工具收集
    Bug Bounty Reference
    [ Mongodb ] 问题总汇
    [ kvm ] 四种简单的网络模型
    [ kvm ] 进程的处理器亲和性和vCPU的绑定
    虚拟化概念总结
    centos7安装tengine强制使用HTTPS访问
    [ SSH 两种验证方式原理 ]
    [ Centos 7 iscsi搭建 及 1台客户端同时挂载多台iscsi服务端问题 ]
  • 原文地址:https://www.cnblogs.com/yuanxiaochou/p/9825360.html
Copyright © 2020-2023  润新知