抽象类与接口的区别及特点

抽象类

简单来说抽象类是一种特殊的类,除了不能实例化对象外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式与普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。

关于抽象类的概念详解


/* 文件名 : Employee.java */
public 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 double computePay()
   {
     System.out.println("Inside Employee computePay");
     return 0.0;
   }
   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;
   }
   public String getAddress()
   {
      return address;
   }
   public void setAddress(String newAddress)
   {
      address = newAddress;
   }
   public int getNumber()
   {
     return number;
   }
}

抽象类不一定包含有抽象方法,但是包含有抽象方法的类一定为抽象类

抽象方法

Abstract 关键字用来声明抽象方法,抽象方法只包含一个方法名。

抽象方法没有方法体,方法名后面直接跟一个分号,而不是花括号。

public abstract class Employee
{
   private String name;
   private String address;
   private int number;
   
   public abstract double computePay();
   
   //其余代码
}

接口

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,是对行为的抽象。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。

接口中可以含有变量和方法,但是要注意,接口中的变量会被隐式地指定为 public static final 变量(并且只能是 public static final变量,用 private 修饰会报编译错误),而方法会被隐式地指定为 public abstract 方法且只能是 public abstract 方法(用其他关键字,比如 private、protected、static、 final 等修饰会报编译错误)。

关于接口的概念详解

[public] interface InterfaceName {
 
}

要让一个类遵循某组特地的接口需要使用 implements 关键字,具体格式如下:

class ClassName implements Interface1,Interface2,[....]{
}

PS : 在 JDK1.8,允许我们给接口添加两种非抽象的方法实现(是为了在不改动已发布接口的前提下,拓展方法):

1、默认方法,添加 default 修饰即可;

2、静态方法,使用 static 修饰;

示例如下:

interface Test{
    //这个是默认方法
    default String get(String aa){
        System.out.println("我是jdk1.8默认实现方法...");
        return "";
    }   
    //这个是静态方法    
    static void staticmethod(){
        System.out.println("我是静态方法");
    }
}

调用得话,静态方法只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用,default 方法只能通过接口实现类的对象来调用。

抽象类与接口的区别及特点

  • 抽象类体现继承(extends)关系,接口体现实现(implements)关系。 Java类是单继承的,抽象类不能实例化对象,只能继承使用,而一个类可以实现多个接口
  • 抽象类侧重于体现复用性(当做一个模板用来继承使用节省代码),接口侧重于灵活性(当做一种协议约定具备某种功能)
  • 抽象类中可以定义非抽象方法(即包含方法体的方法),子类继承后可以直接使用非抽象方法,与普通类的功能一样。但是接口中的方法都是抽象方法,必须子类实现才能用。
  • 抽象类可以包含普通的成员变量与普通类无异,但是接口中的成员只能是 public static final变量,可以省略修饰符,默认就是 public static fina
  • 抽象类有构造方法,用于给子类的对象初始化,而接口没有抽象方法。

特点 1:

抽象类不可以实例化,既不能通过new的方式创建对象,必须由子类覆盖了所有的抽象方法后,该子类才可以实例化,否则该子类也必须是抽象类

特点2:

抽象类abstract关键字不能与哪些关键字共存:

  • final 因为抽象类就是用来被继承的,但是final修饰的方法不能被继承
  • static 因为类.方法(),此方法没有方法体,没有意义
  • private 因为抽象方法是要被子类覆盖的,加上private子类就不知道这个方法了。

特点3:

接口中声明变量必须是public static final 的,接口中定义的方法都是 public abstract ,接口中的成员必须初始化,且全是常量,不是变量

特点4:

接口是抽象类的变体(只含有静态成员及抽象方法的抽象类),接口也可以通过extends来继承其他接口。格式如:
class 类名称 implements 接口A,接口B{//接口的实现}
interface 子接口名称 extends 父接口1,父接口2,…{}

总结:

以上是对抽象类及接口简单的总结

关于接口和抽象类的更具象的分析可以阅读下面这篇博文,有助于理解。
深入理解 Java 的接口和抽象类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值