【问题标题】:Is it possible to call both default and parameterized constructors of SubClass and SuperClass for a particular instance(parameterized) in Java?是否可以在 Java 中为特定实例(参数化)调用 SubClass 和 SuperClass 的默认构造函数和参数化构造函数?
【发布时间】:2014-05-01 19:44:15
【问题描述】:

我正在尝试以下场景:

public class SuperClass {
    public SuperClass(){
        System.out.println("Super Constructor");
    }
    public SuperClass(int i){
        this();
        System.out.println("Parameterized Super Constructor");
    }
}
public class SubClass extends SuperClass{
    public SubClass(){
        System.out.println("Sub Constructor");
    }
    public SubClass(int i){
        super(i); /* Need to call **this()** here .. Is this possible? */
        System.out.println("Parameterized  Sub Constructor");
    }
}
public class Inheritance {
    public static void main(String[] args) {
        SubClass sub=new SubClass(5);
    }
}

在这种情况下如何调用默认构造函数和参数化构造函数?

【问题讨论】:

    标签: java inheritance parameterized default-constructor


    【解决方案1】:

    如果您在非参数化构造函数中具有需要同时调用两者的功能,那么我建议您将其从那里移到两个构造函数都可以调用的 private void init() 函数中。

    【讨论】:

    • 谢谢。似乎是一个更好的主意。但我认为,可以在构造函数本身之间维护调用。
    【解决方案2】:

    简单的回答,不,你不能同时调用thissuper(i)。 Java 只允许您在构造函数的开头链接另一个构造函数。

    你可以按照 DFreeman 的建议去做,或者 Java 中有另一个技巧;

    public class SuperClass {
        public SuperClass(){
            System.out.println("Super Constructor");
        }
        public SuperClass(int i){
            this();
            System.out.println("Parameterized Super Constructor");
        }
    }
    public class SubClass extends SuperClass{
    
        {
            /*
             * Default initialization block.
             * During compile time, this block will get copy to each of the constructor.
             */
            System.out.println("Sub Constructor");
        }
    
        public SubClass(int i){
            super(i); 
            System.out.println("Parameterized  Sub Constructor");
        }
    }
    
    public class Inheritance {
        public static void main(String[] args) {
            SubClass sub=new SubClass(5);
        }
    }
    

    因此,如果您有一些常见的初始化(例如分配默认值),则可以利用默认初始化块。

    但是,如果需要在构造函数中调用不同的参数化构造函数,那你就不走运了。您要么必须重组构造函数,要么调用一些常见的私有初始化方法。

    【讨论】:

    • 酷.. 我不知道这个块。非常感谢。
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多