如何在Java中调用抽象类的默认构造函数

如何在Java中调用抽象类的默认构造函数,java,constructor,Java,Constructor,我试图研究这个问题,但没有找到一个明确的问题。请帮我做这件事 在子类的构造函数中,可以调用 super(/*params if needed*/); 为了调用其父类的构造函数,可以在子类中使用super。您可能知道,您无法创建抽象类的实例 abstract class Parent{ Parent(){ System.out.println("Parent contructor!"); } } public cla

我试图研究这个问题,但没有找到一个明确的问题。请帮我做这件事

在子类的构造函数中,可以调用

super(/*params if needed*/);

为了调用其父类的构造函数,可以在子类中使用super。您可能知道,您无法创建抽象类的实例

  abstract class Parent{
        Parent(){
            System.out.println("Parent contructor!");
        }
    }


    public class Child extends Parent{

        public Child() {
            super();
            System.out.println("Child contructor!");
        }

        public static void main(String[] args) {
            new Child();
        }
    }
即使您没有在子类中指定super,仍然会调用父类构造函数,因为在生成.class时,编译器会将super放在子类的默认构造函数中。如果父类中只有参数化构造函数,则必须通过子类构造函数中的super..parameter显式调用父类构造函数。希望这有帮助

类似这样:

abstract class MyClass{ 
    int val;
    public MyClass( int val) {
        this.val= val;
    }

}

class Test extends MyClass{
    public Test () {
        super(2);
    }
}

虽然不能为abstract类调用默认构造函数,但可以为体现抽象类的子类调用默认构造函数

例如:

 abstract class Animal {

      public Animal (){ ... }

      abstract public String sound();
 }


 class Horse extends Animal{

    public Horse(){ 
        super()
    }

    @Override 
    public String sound(){ 
        return "neigh";
    }
 }

 class Dog extends Animal{

    public Dog(){ 
        super()
    }

    @Override 
    public String sound(){ 
        return "woof";
    }
 }
制造一种新的动物是不可能的。对于常见类型的动物,您可以使用Annomy创建新的Dog-s和Horse-s示例:

将创建您提供的具体类的新实例:

 Dog   fido  = new Dog();
 Horse hack  = new Horse();

 Dog   puppy = makeAnimals( fido );   //  new uninitialised Dog   instance
 Horse foal  = makeAnimals( hack );   //  new uninitialised Horse instance
我不知道这是否符合目的。我想省略问题的目的是投反对票的一个原因

或者,您可以创建注释性实例

Animal parrot = new Animal() {

    @Override 
    public String sound(){ 
        return "squawk";
    }
}

作为制作新动物类型的一种方法。如果你在为真实的动物做一些事情,可能最好是创建一个Parot子类。

如果没有任何肮脏的魔法,你不能创建抽象类的实例。你不能实例化一个抽象类,而是从一个子类,你可以用super方法调用父构造函数。@Deepak幸运的是,我知道脏魔法MyAbstract childObject=new MyChildClass;mir,我相信MyClass是抽象类中的参数化构造函数。@Deepak父抽象类中没有默认构造函数,子类中使用的构造函数必须显式调用父构造函数。Sanket D,我擅长super,并且不能创建抽象类的实例。但我对您的答案感到困惑的是,具有print语句的“Parent”应该是默认构造函数,因此根据您的示例,默认构造函数可以在抽象类中定义。默认构造函数和参数化构造函数都可以在抽象类中定义
Animal parrot = new Animal() {

    @Override 
    public String sound(){ 
        return "squawk";
    }
}