为什么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