zoukankan      html  css  js  c++  java
  • java执行构造器和初始化字段的顺序

    测试代码:

    class Foo {
        private int f1 = 2;
        private boolean f2 = true;
        private String f3 = "foo";
        private R f4 = new R("foo");
    
        protected Foo() {
            System.out.println("Foo.<ctor>()");
    
            dump();
        }
    
        protected void dump() {
            System.out.println("Foo.dump()");
            System.out.println("  Foo.f1=" + this.f1);
            System.out.println("  Foo.f2=" + this.f2);
            System.out.println("  Foo.f3=" + this.f3);
            System.out.println("  Foo.f4=" + this.f4);
        }
    }
    
    class Bar extends Foo {
        private int f1 = 5;
        private boolean f2 = false;
        private String f3 = "bar";
        private R f4 = new R("bar");
    
        public Bar() {
            System.out.println("Bar.<ctor>()");
    
            dump();
        }
    
        @Override
        protected void dump() {
            super.dump();
    
            System.out.println("Bar.dump()");
            System.out.println("  Bar.f1=" + this.f1);
            System.out.println("  Bar.f2=" + this.f2);
            System.out.println("  Bar.f3=" + this.f3);
            System.out.println("  Bar.f4=" + this.f4);
        }
    }
    
    class R {
        private final String name;
        public R(String name) {
            System.out.println("R.<ctor>("" + name + "")");
            this.name = name;
        }
    
        public String toString() {
            return "R("" + this.name + "")";
        }
    }
    
    public class TestVirtual {
        public static void main(String[] argv) {
            Bar b = new Bar();
        }
    }
    

    执行结果:

    R.<ctor>("foo")
    Foo.<ctor>()
    Foo.dump()
      Foo.f1=2
      Foo.f2=true
      Foo.f3=foo
      Foo.f4=R("foo")
    Bar.dump()
      Bar.f1=0
      Bar.f2=false
      Bar.f3=null
      Bar.f4=null
    R.<ctor>("bar")
    Bar.<ctor>()
    Foo.dump()
      Foo.f1=2
      Foo.f2=true
      Foo.f3=foo
      Foo.f4=R("foo")
    Bar.dump()
      Bar.f1=5
      Bar.f2=false
      Bar.f3=bar
      Bar.f4=R("bar")
    

     结论:

    1 java在基类构造器中调用虚方法,被调用的是实际类型的方法。

    2 java执行构造器的顺序是:

    • Object类的构造器。
    • 初始化基类字段。
    • 执行基类构造器。
    • 初始化子类字段。
    • 执行子类构造器。

    3 如果未在定义时为字段设置初始值,那么数值类型的字段被初始化为0,boolean类型的字段被初始化为false,引用类型的字段被初始化为null。

    4 如果在定义时为字段设置初始值,同时在构造器中为字段设置初始值,那么字段会被初始化两次:首先被初始化为定义时的值,然后在构造器中再次被初始化。

  • 相关阅读:
    【BZOJ1029】[JSOI2007] 建筑抢修(堆优化贪心)
    【CF799B】T-shirt buying(一道很水的小根堆)
    【BZOJ1076】[SCOI2008] 奖励关(状压DP)
    【BZOJ1087】[SCOI2005] 互不侵犯King(状压DP)
    【BZOJ3209】花神的数论题(数位DP)
    【BZOJ1833】[ZJOI2010] count 数字计数(数位DP)
    【洛谷】CYJian的水题大赛 解题报告
    【洛谷3959】宝藏(随机算法乱搞)
    【洛谷2709】小B的询问(莫队模板题)
    【洛谷2403】[SDOI2010] 所驼门王的宝藏(Tarjan+dfs遍历)
  • 原文地址:https://www.cnblogs.com/mopno1/p/9110443.html
Copyright © 2011-2022 走看看