简体   繁体   English

Java / C ++对象创建顺序

[英]Java/C++ Object creation order

Please take a look at the following piece of code: 请看下面的代码:

class Parent {
    Parent() {
        printFunction();
    }

    public void printFunction() {
        System.out.println("Parent Print");
    }

    class ParentInner {
       ParentInner() {
          InnerPrint();
       }

       void InnerPrint() {
          System.out.println("Parent Inner print");
       }
    }
}

class Child extends Parent {
    ChildInner ci;
    Child() {
        super();
        ci = new ChildInner();
    }

    @Override
    public void printFunction() {
        System.out.println("Child Print");
    }

    class ChildInner extends ParentInner {
       ChildInner() {
          super();
       }

       @Override
       void InnerPrint() {
          System.out.println("Child Inner print");
       }
    }

    public static void main(String[] args) {
        Child c = new Child();
    }
}

The output of this code from a Java compiler (both eclipse and linux) is: 来自Java编译器(eclipse和linux)的此代码的输出为:

Child print
Child Inner print

This, in C++ (gcc) 在C ++(gcc)中

#include <iostream>
#include <new>
using namespace std;

class Parent {
    public:
    Parent() {
        printFunction();
    }

    virtual void printFunction() {
        cout << "Parent print\n";
    }

    class ParentInner {
       public:
       ParentInner() {
          InnerPrint();
       }

       virtual void InnerPrint() {
          cout << "Parent Inner print\n";
       }
    };
};

class Child : public Parent {
    public:
    Child():Parent() {
        ci = new ChildInner();
    }

    void printFunction() {
        cout << "Child print\n";
    }

    class ChildInner : public ParentInner {
       public:
       ChildInner():ParentInner() {
       }

       void InnerPrint() {
          cout << "Child Inner print\n";
       }
    };

    ChildInner *ci;
};

int main(int argc, char* argv[]) {
   Child *c = new Child();
   return 0;
}

prints: 印刷品:

Parent print
Parent Inner print

What say? 说啥? I think the base class gets created first, then the child- gcc is logical. 我认为首先创建基类,然后创建子gcc是合乎逻辑的。 What's up in Java? Java发生了什么?

It's as you suspect. 就像你怀疑的那样。 When you call the Parent constructor from the Child constructors initializer list, the Child object is not fully created yet. 当您从“ Child构造函数初始化器列表中调用“ Parent Child构造器时,“ Child对象尚未完全创建。 So in a way there is no Child object yet, just the Parent object. 因此,在某种程度上,还没有Child对象,只有Parent对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM