📜  为什么Java接口不能有构造函数而抽象类可以有?

📅  最后修改于: 2022-05-13 01:54:42.246000             🧑  作者: Mango

为什么Java接口不能有构造函数而抽象类可以有?

先决条件: Java中的接口和抽象类。

构造函数 是一个特殊的成员函数,用于初始化新创建的对象。创建类的对象时会自动调用它。

为什么接口不能有构造函数?

  • 一个接口 是类的完整抽象。默认情况下,接口中存在的所有数据成员都是公共的、静态的、 和最终。所有的静态final字段都应该在声明的时候赋值,否则会抛出编译错误“ variable variable_Name not initialized in default constructor ”。
  • 接口内部的方法默认是公共抽象的,这意味着方法实现不能由接口本身提供,它必须由实现类提供。因此,不需要在接口内部有构造函数。
  • 构造函数用于初始化非静态数据成员,由于接口中没有非静态数据成员,因此不需要构造函数
  • 接口中存在的方法只是声明为未定义,由于没有方法的实现,因此不需要为调用接口中的方法创建对象,因此没有构造函数在其中。
  • 如果我们尝试在接口内创建构造函数,编译器将给出编译时错误。
Java
// Java program that demonstrates why
// interface can not have a constructor
 
// Creating an interface
interface Subtraction {
 
    // Creating a method, by default
    // this is a abstract method
    int subtract(int a, int b);
}
 
// Creating a class that implements
// the Subtraction interface
class GFG implements Subtraction {
 
    // Defining subtract method
    public int subtract(int a, int b)
    {
        int k = a - b;
        return k;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
 
        // Creating an instance of
        // GFG class
        GFG g = new GFG();
        System.out.println(g.subtract(20, 5));
    }
}


Java
// A Java program to demonstrates
// an abstract class with constructors
 
// Creating an abstract class Car
abstract class Car {
 
  // Creating a constructor in
  // the abstract class
    Car() {
      System.out.println("car is created");
    }
}
 
// A class that extends the
// abstract class Car
class Maruti extends Car {
 
  // Method defining inside
  // the Maruti class
    void run() {
      System.out.println("Maruti is running");
    }
}
 
class GFG {
 
    public static void main(String[] args)
    {
        Maruti c = new Maruti();
        c.run();
    }
}


输出
15

在上面的程序中,我们创建了一个接口Subtraction ,它定义了一个方法subtraction() ,其实现由GFG类提供。为了调用一个方法,我们需要创建一个对象,因为接口内部的方法默认是public abstract,这意味着接口内部的方法没有主体。因此,不需要调用接口中的方法。由于我们不能调用接口中的方法,因此不需要为接口创建对象,也不需要在其中包含构造函数。

为什么抽象类有构造函数

  • 构造函数的主要目的是初始化新创建的对象。在抽象类中,我们有实例变量、抽象方法和非抽象方法。我们需要初始化非抽象方法和实例变量,因此抽象类有一个构造函数。
  • 此外,即使我们不提供任何构造函数,编译器也会在抽象类中添加默认构造函数。
  • 抽象类可以被继承 通过任意数量的子类,它们可以使用抽象类中存在的构造函数的功能。
  • 抽象类中的构造函数只能在构造函数链接期间调用,即当我们创建子类的实例时。这也是抽象类可以有构造函数的原因之一。

Java

// A Java program to demonstrates
// an abstract class with constructors
 
// Creating an abstract class Car
abstract class Car {
 
  // Creating a constructor in
  // the abstract class
    Car() {
      System.out.println("car is created");
    }
}
 
// A class that extends the
// abstract class Car
class Maruti extends Car {
 
  // Method defining inside
  // the Maruti class
    void run() {
      System.out.println("Maruti is running");
    }
}
 
class GFG {
 
    public static void main(String[] args)
    {
        Maruti c = new Maruti();
        c.run();
    }
}
输出
car is created
Maruti is running