个性化阅读
专注于IT技术分析

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

本文概述

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

一种建设者 是用于初始化新创建的对象的特殊成员函数。创建类的对象时会自动调用它。

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

  • 接口 是类的完整抽象。默认情况下, 界面中存在的所有数据成员都是public, static, 最后。所有静态的final字段都应在声明时分配值, 否则它将引发编译错误, 提示”变量变量名称未在默认构造函数中初始化”。
  • 默认情况下, 接口内部的方法是公共抽象的, 这意味着方法实现不能由接口本身提供, 而必须由实现类提供。因此, 不需要在接口内使用构造函数。
  • 构造函数用于初始化非静态数据成员, 并且由于接口中没有非静态数据成员, 因此不需要构造函数
  • 接口中存在的方法仅声明为未定义。由于没有方法的实现, 因此无需在接口中创建用于调用方法的对象, 因此无需在其中构造函数。
  • 如果我们尝试在接口内创建构造函数, 则编译器将给出编译时错误。

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 Substraction interface
class GFG implements Subtraction {
  
     // Defining substract 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 ));
     }
}

输出如下

15

在上面的程序中, 我们创建了一个界面减法定义了一种方法substract(), 其实现由类提供玻璃纤维。为了调用方法, 我们需要创建一个对象, 因为默认情况下, 接口内部的方法是公共抽象的, 这意味着接口内部的方法没有主体。因此, 不需要在接口中调用该方法。由于我们无法在接口中调用方法, 因此无需为接口创建对象, 也无需在其中构造函数。

为什么抽象类有一个 建设者?

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

Java

// A Java program to demonstrates
// an abstract class with constrctors
  
// 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

赞(0)
未经允许不得转载:srcmini » 为什么Java接口不能有构造函数而抽象类可以有?

评论 抢沙发

评论前必须登录!