一、概念介绍
抽象类:
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、比较
- 从设计层面上看,抽象类提供了一种 IS-A 关系,需要满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
- 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
- 接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。
7、使用场景
使用接口:
- 需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Compareable 接口中的 compareTo() 方法;
- 需要使用多重继承。
使用抽象类: - 需要在几个相关的类中共享代码。
- 需要能控制继承来的成员的访问权限,而不是都为 public。
- 需要继承非静态和非常量字段。
- 在很多情况下,接口优先于抽象类。因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。
二、代码演练
- 抽象类实例 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;
}
}
- 继承抽象类的手机产品
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("电子产品类都能蓄电!测试重写");
}
}
- 测试抽象类
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();
}
}
- 接口 TypeProduct
在这里插入代码片package org.storemanage.regestercenter.abstrcandinterface;
/**
* @CreateTime: 2024-08-19
* @Description: 产品分类接口
* @Version: 1.0
* @Author: hkf
*/
public interface TypeProduct {
//名称
void name();
//地址
String address();
}
- 接口实现
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
各位老板,如有不足,欢迎指出,共同进步,谢谢