JAVA抽象类与接口的区别,看完这篇你就悟了

一、概念介绍

抽象类
1、抽象类是通过使用关键字:abstract来定义的。
2、抽象类是一种特殊的类,它不能被实例化,主要用于被其他类继承。
3、抽象类中可以包含抽象方法和非抽象方法,但至少要有一个抽象方法。抽象方法是一种没有实现的方法,只有定义,需要在子类中被实现。
4、抽象类用abstract关键字来修饰,而抽象方法同样使用abstract关键字来修饰‌ ;
5、抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色

接口:
1、在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

2、接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

3、除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

4、接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

5、接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。从 Java 8 开始,接口也可以拥有默认的方法实现。
接口的成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected。接口的字段默认都是 static 和 final 的。

6、比较

  1. 从设计层面上看,抽象类提供了一种 IS-A 关系,需要满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
  2. 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
  3. 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
  4. 接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。

7、使用场景
使用接口:

  • 需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Compareable 接口中的 compareTo() 方法;
  • 需要使用多重继承。
    使用抽象类:
  • 需要在几个相关的类中共享代码。
  • 需要能控制继承来的成员的访问权限,而不是都为 public。
  • 需要继承非静态和非常量字段。
  • 在很多情况下,接口优先于抽象类。因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。

二、代码演练

  1. 抽象类实例 ElectronicProduct
package org.storemanage.regestercenter.abstrcandinterface;

/**
 * @CreateTime: 2024-08-19
 * @Description: 电子产品抽象类
 * @Version: 1.0
 * @Author: hkf
 */
public abstract class ElectronicProduct {

    private String  productName;

    /**
     *  操作电子产品操作
     *
     */
  public   abstract  void  operatingProduct();
  
    /**
     *  默认方法
     */
    public void electricPowers(){
        System.out.println("电子产品类都能蓄电!"+productName);
    }

    private void  electricSystem(){
        System.out.println("我是安卓系统!!!!");
    }
    
    public String getProductName() {
        return productName;
    }
    
    public void setProductName(String productName) {
        this.productName = productName;
    }
}
  1. 继承抽象类的手机产品
package org.storemanage.regestercenter.abstrcandinterface;

/**
 * @CreateTime: 2024-08-19
 * @Description: 手机实现类
 * @Version: 1.0
 * @Author: hkf
 */
public class MobilePhone extends ElectronicProduct {
    @Override
    public void  operatingProduct() {
      System.out.println("我是手机,使用说明如下-----------");
    }

    public void electricPower(){
        System.out.println("电子产品类都能蓄电!测试重写");
    }
}

  1. 测试抽象类
package org.storemanage.regestercenter.abstrcandinterface;

/**
 * @CreateTime: 2024-08-19
 * @Description: 测试方法类
 * @Version: 1.0
 * @Author: hkf
 */
public class TestMobilePhone {
    public static void main(String[] args) {

        MobilePhone mobilePhone = new MobilePhone();
        mobilePhone.operatingProduct();
        mobilePhone.electricPower();

    }
}

  1. 接口 TypeProduct
在这里插入代码片package org.storemanage.regestercenter.abstrcandinterface;

/**
 * @CreateTime: 2024-08-19
 * @Description: 产品分类接口
 * @Version: 1.0
 * @Author: hkf
 */


public interface TypeProduct {

	//名称
    void   name();
    //地址
    String address();
}

  1. 接口实现
package org.storemanage.regestercenter.abstrcandinterface;

/**
 * @CreateTime: 2024-08-19
 * @Description: 测试方法类
 * @Version: 1.0
 * @Author: hkf
 */
public class TestMobilePhone {
    public static void main(String[] args) {

        //抽象类
        MobilePhone mobilePhone = new MobilePhone();
        mobilePhone.operatingProduct();
        mobilePhone.electricPower();

        //接口
        MobileType mobileType = new MobileType();
        String address = mobileType.address();
        System.out.println(address);
        mobileType.name();

    }
}

6)运行 结果图

我是手机,使用说明如下-----------
电子产品类都能蓄电!测试重写
我家地址为四川省成都市武侯区
我是电子产品!!!
Process finished with exit code 0

各位老板,如有不足,欢迎指出,共同进步,谢谢
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值