您的位置:

Java接口和抽象类的异同详解

一、定义

1、接口:接口是一种抽象的类型,它定义了一组方法,但是没有实现这些方法。只有定义,没有具体实现,需要在具体的类中去实现。接口是Java世界中公认的一种标准,将接口作为主要的开发方式。可以通过接口来实现多态和解决相关问题,使代码的耦合度大大降低,扩展性和复用性增强。

<public interface InterfaceName>
{
   //接口中的声明语句
}</public>

2、抽象类:抽象类是用来抽象化具有相似的属性和方法的类的一种机制,它本身不能实例化,但是可以被子类继承。抽象类中包含抽象方法,抽象方法必须在子类中实现,并且子类必须定义自己的一些特定方法。抽象类可以为具体子类提供一个通用的接口,可以避免代码的重复性。

<public abstract class ClassName>
{
   //类中的声明语句
}</public>

二、使用

1、接口的使用:接口和类的继承相似,但是接口没有任何实现的方式,只是定义了一组规范。接口中的所有方法都是抽象的,必须由实现了接口的类来实现接口中的方法。

<interface Shape>
{
   public void draw(); // 定义一个抽象方法
}</public>
 
// 实现接口
public class Rectangle implements Shape 
{
   public void draw() 
   {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

// 调用实现的方法
public class Test 
{
   public static void main(String[] args) 
   {
      Shape shape = new Rectangle(); // 多态
      shape.draw();
   }
}

2、抽象类的使用:抽象类不能实例化,必须被子类继承来使用。抽象类的抽象方法必须由子类来实现,否则子类也必须变成抽象类。可以用抽象类作为多个子类的共同类型,使代码更加灵活。

<abstract class Employee>
{
   private String name;
   private String address;
   private int number;
   
   // 构造函数
   public Employee(String name, String address, int number) 
   {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   
   // 抽象方法
   public abstract double computePay();
   
   // 其他方法
   public void mailCheck() 
   {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }
   
   // 其他方法
   public String toString() 
   {
      return name + " " + address + " " + number;
   }
   
   // 其他普通方法
   public String getName() 
   {
      return name;
   }
}

// 子类Employee的实现
class Salary extends Employee
{
   private double salary; // Annual salary
   
   public Salary(String name, String address, int number, double salary) 
   {
      super(name, address, number);
      setSalary(salary);
   }
   
   public void mailCheck() 
   {
      System.out.println("Within mailCheck of Salary class ");
      System.out.println("Mailing check to " + getName()
      + " with salary " + salary);
   }
 
   public double getSalary() 
   {
      return salary;
   }
   
   public void setSalary(double newSalary) 
   {
      if(newSalary >= 0.0) 
      {
         salary = newSalary;
      }
   }
   
   public double computePay() 
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

public class AbstractDemo
{
   public static void main(String [] args)
   {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
 }

三、相同点

1、都是用来实现Java中的面向对象的概念,解决了代码中的封装、继承和多态问题。

2、都可以包含方法和变量,这些方法和变量都有访问权限控制。

3、都不能直接实例化,都需要在具体的类中被实现或继承。

四、不同点

1、接口中的所有方法都是抽象的,而抽象类中可以有部分方法是抽象的,也可以有非抽象的方法。

2、一个类可以实现多个接口,但是只能继承一个抽象类。

3、接口中可以有常量,但是抽象类中没有。

4、接口中方法的访问权限必须是public,而抽象类中可以有public、protected和默认访问权限。

5、抽象类中有构造函数,而接口中没有。

五、总结

Java接口和抽象类都是实现面向对象中的封装、多态、继承等概念的重要手段。虽然它们有很多相似点,但是也有不同的地方,因此开发人员在实际编程中需要灵活使用,根据需求选择适合的方式。在编写代码的时候,应该尽可能减少类之间的耦合,提高代码的扩展性和复用性,从而提高代码的维护性和可读性。