当前位置: 首页 > 面试题库 >

在此Java代码中,构造函数的顺序是什么?

通学真
2023-03-14
问题内容

这是代码,我定义了两个名为父亲和儿子的类,并在主函数中创建它们:

public class Test {
    public static void main(String[] args) {
        Father father = new Son();
    }
}

class Father {
    private String name = "father";
    public Father() {
        who();
        tell(name);
    }
    public void who() {
        System.out.println("this is father");
    }
    public void tell(String name) {
        System.out.println("this is " + name);
    }
}

class Son extends Father {
    private String name = "son";
    public Son() {
        who();
        tell(name);
    }
    public void who() {
        System.out.println("this is son");
    }
    public void tell(String name) {
        System.out.println("this is " + name);
    }
}

我得到这样的输出:

this is son
this is father
this is son
this is son

但是我不明白这是怎么发生的?谁能告诉我为什么?


问题答案:
  1. 让我们从开始Son

    public Son() {
    super(); // implied
    who();
    tell(name);
    

    }

  2. 父亲的构造函数被调用。

    public Father() {
    who();
    tell(name);
    

    }

  3. 由于who()被覆盖Son,因此Son将调用的版本,并打印“这是儿子”。

  4. tell()也被覆盖,但传入的值是Father.name,打印“这是父亲”。

  5. 最后,将使构造函数中的who()tell(name)调用Son分别打印“ this is son”和“ this is son”。



 类似资料:
  • 本文向大家介绍请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?相关面试题,主要包含被问及请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA构造函数 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一

  • 问题内容: 我今天早些时候在代码中结束了以下场景(我承认这有点怪异,并且从此以后就进行了重构)。当我运行单元测试时,我发现在超类构造函数运行时尚未设置字段初始化。我意识到我不完全了解构造函数/字段初始化的顺序,因此我希望大家能向我解释这些顺序。 JUnit的缩写backtrace如下,我想我期望$ Foo。 设置foo。 问题答案: 是的,在Java中(例如,与C#不同) , 在超类构造函数 之后

  • 问题内容: 所以我正在学习Java。我有一个月的时间,我刚刚了解了构造函数。但是我看不到创建一个的全部目的。为什么我什么时候要使用?我知道它没有主方法,您可以从主类中调用构造函数。任何人都可以启发我这个话题,这对我有很大帮助。 问题答案: 构造函数是用来初始化/设置类实例的对象。 如果您有一个对象需要一些处理才能使用(例如,初始化成员),则应在构造函数中执行此操作。 理想情况下,您永远不应拥有“部

  • 问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,

  • 问题内容: //: c07:Sandwich.java // Order of constructor calls. // package c07; // import com.bruceeckel.simpletest.*; 此代码的输出是 由于类中的字段是按照声明的顺序创建的,为什么不这样做 在上面列表的顶部? 另外,在此代码中它打算做什么? 起初我以为这是一个匿名类,但看起来并不像它。它正在

  • 问题内容: 在Java中调用基类构造函数是强制性的吗?在C ++中,它是可选的,所以我问这个问题。 当我扩展时,我得到这个错误: 那么,调用基本构造函数的目的是什么?当我创建对象时,基类的构造函数将调用&然后涉及到派生权。 问题答案: 如果您自己不调用no- args构造函数,则该隐式调用;如果该构造函数不存在,则无效。要求调用超构造函数的原因是,超类通常在构造后会处于其预期的状态,其中可能包含无