Can an abstract class have a constructor?

前端 未结 22 2175
甜味超标
甜味超标 2020-11-22 05:25

Can an abstract class have a constructor?

If so, how can it be used and for what purposes?

相关标签:
22条回答
  • 2020-11-22 06:01

    Yes it can, abstract classes constructors are generally used for super calls for initialization events common to all the subclasses

    0 讨论(0)
  • 2020-11-22 06:04

    Yes, Abstract Classes can have constructors !

    Here is an example using constructor in abstract class:

    abstract class Figure { 
    
        double dim1;        
        double dim2; 
    
        Figure(double a, double b) {         
            dim1 = a;         
            dim2 = b;         
        }
    
        // area is now an abstract method 
    
       abstract double area(); 
    
    }
    
    
    class Rectangle extends Figure { 
        Rectangle(double a, double b) { 
            super(a, b); 
        } 
        // override area for rectangle 
        double area() { 
            System.out.println("Inside Area for Rectangle."); 
            return dim1 * dim2; 
        } 
    }
    
    class Triangle extends Figure { 
        Triangle(double a, double b) { 
            super(a, b); 
        } 
        // override area for right triangle 
        double area() { 
            System.out.println("Inside Area for Triangle."); 
            return dim1 * dim2 / 2; 
        } 
    }
    
    class AbstractAreas { 
        public static void main(String args[]) { 
            // Figure f = new Figure(10, 10); // illegal now 
            Rectangle r = new Rectangle(9, 5); 
            Triangle t = new Triangle(10, 8); 
            Figure figref; // this is OK, no object is created 
            figref = r; 
            System.out.println("Area is " + figref.area()); 
            figref = t; 
            System.out.println("Area is " + figref.area()); 
        } 
    }
    

    So I think you got the answer.

    0 讨论(0)
  • 2020-11-22 06:04

    package Test1;

    public class AbstractClassConstructor {

    public AbstractClassConstructor() {
    
    }
    
        public static void main(String args[]) {
           Demo obj = new Test("Test of code has started");
           obj.test1();
        }
    

    }

    abstract class Demo{
        protected final String demoValue;
    
        public Demo(String testName){
            this.demoValue = testName;
        }
    
        public abstract boolean test1();
    }
    
    class Test extends Demo{
    
        public Test(String name){
            super(name);
        }
    
        @Override
        public boolean test1() {
           System.out.println( this.demoValue + " Demo test started");
           return true;
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 06:05

    The purpose of the constructor in a class is used to initialize fields but not to "build objects". When you try to create a new instance of an abstract SuperClass, the compiler will give you an error. However, we can inherit an abstract class Employee and make use of its constructor by setting its variables See example below

    public abstract class Employee {
      private String EmpName;
      abstract double calcSalary();
    
      Employee(String name) {
        this.EmpName = name;// constructor of abstract class super class
      }
    }
    
    class Manager extends Employee{
     Manager(String name) {
        super(name);// setting the name in the constructor of sub class
     }
    double calcSalary() {
        return 0;
     }
    }
    
    0 讨论(0)
  • 2020-11-22 06:07

    Although there are many good answers, I would like to give my 2 cents.

    Constructor DOES NOT BUILD THE OBJECT. It is used to initialize an object.

    Yes, an Abstract class always has a constructor. If you do not define your own constructor, the compiler will give a default constructor to the Abstract class. Above holds true for all classes - nested, abstract, anonymous, etc.

    An abstract class (unlike interface) can have non-final non-static fields which need initialization. You can write your own constructor in the abstract class to do that. But, in that case, there won't be any default constructor.

    public abstract class Abs{
        int i;
        int j;
        public Abs(int i,int j){
            this.i = i;
            this.j = j;
            System.out.println(i+" "+j);
        }
    }
    

    Be careful while extending above abstract class, you have to explicitly call super from each constructor. The first line of any constructor calls to super(). if you do not explicitly call super(), Java will do that for you. Below code will not compile:

    public class Imp extends Abs{
    
    public Imp(int i, int j,int k, int l){
        System.out.println("2 arg");
    }
    }
    

    You have to use it like below example:

    public class Imp extends Abs{
    
    public Imp(int i, int j,int k, int l){
        super(i,j);
        System.out.println("2 arg");
    }
    }
    
    0 讨论(0)
  • 2020-11-22 06:07

    yes it is. And a constructor of abstract class is called when an instance of a inherited class is created. For example, the following is a valid Java program.

    // An abstract class with constructor
    abstract class Base {
    Base() { System.out.println("Base Constructor Called"); }
    abstract void fun();
        }
    class Derived extends Base {
    Derived() { System.out.println("Derived Constructor Called"); }
    void fun() { System.out.println("Derived fun() called"); }
        }
    
    class Main {
    public static void main(String args[]) { 
       Derived d = new Derived();
        }
    
    }
    

    This is the output of the above code,

    Base Constructor Called Derived Constructor Called

    references: enter link description here

    0 讨论(0)
提交回复
热议问题