接口和抽象类(设计角度来分析)

抽象类与接口的区别与应用
本文详细解析了抽象类和接口的语法特性、存在意义及应用场景,对比了两者在代码复用与解耦方面的不同作用,适用于面向对象编程的学习者。

1.抽象类和接口的语法特性

抽象类不允许被实例化,只能被继承.它可以包含属性和方法.方法既可以包含代码的实现,也可以不包含代码的实现.不包含代码的实现叫做抽象方法.接口不能包含属性,只能声明方法,方法不能包含代码实现.类实现接口的时候,必须实现接口中声明的所有方法.

2.抽象类和接口存在的意义

抽象类是对 成员变量和方法的抽象,是一种is-a关系,是为了解决代码复用问题.接口仅仅是对方法的抽象,是一种has-a的关系,表示具有一组行为特性,是为了解决解耦问题,隔离接口和具体的实现,提高diamante的扩展性.

3,抽象类和接口的应用场景和区别

什么时候该用抽象类?设么时候该用接口?实际上,判断的标准很简单.如果表示一种is-a 的关系,并且是为了解决代码的复用问题,我们就用抽象类;如果要表示一样has-a关系,并且是为了解决抽象而非代码复用问题,我们就用接口.

如果让我聊聊接口和抽象类,我会这么聊:定义,区别(是什么),存在意义(从哪来),应用(到哪去)

1.定义:

抽象类:不允许实例化,只能被继承;可包含属性和方法,包含抽象方法;子类继承抽象类必须重写抽象方法

接口:不允许实例化,只能被实现;不包含属性和普通方法,包含抽象方法,静态方法,default方法,类实现接口时,必须实现抽象方法.

2.意义:

抽象类:解决复用问题,适合于is-a关系.

接口:解决抽象问题,适合has-a关系.

3应用:.....

 

抽象类使用例子:

代码复用(三个具有相同性质的类直接继承抽象类获取他的抽象定义方法,例如本科专科  抽象类为学生,使用的时候不需要创建多个对象)

抽象类的访问修饰符 为protected  同包下使用

//定义一个动物抽象类  里面有一个eat的方法和doInit抽象方法

//实现这个Animal的类必须实现doInit方法 调用eat方法的话直接在使用的地方eat();

abstract class Animal{  
    public String eat(String food){
        return food+":is food";
    }
   abstract void doInit() ;
}

顺便写个枚举:

enum Test{
    ASD1("1","one"),
    ASD2("2","two"),
    ASD3("3","three");

    private String key;
    private String value;
    private Test(String key,String value){
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }//根据key值得到他的value值
public static String getValueByCode(String code){
    for (Test ele : values()) {
        if(ele.getKey().equals(code)) return ele.getValue();
    }
    return null;
}

Test.getValueByCode("1") // one

 

### Java中抽象类接口区别及使用场景 #### 一、基本概念 抽象类接口是Java编程语言中的两种重要机制,用于实现多态性代码重用。 - 抽象类是一种不能被实例化的特殊类,它可以包含抽象方法(无具体实现的方法)以及非抽象方法(具有具体实现的方法)。子类通过继承抽象类并实现其抽象方法来完成功能扩展[^2]。 - 接口则是一组行为规范的集合,其中定义的是未实现的方法签名。从JDK 1.8开始,接口允许包含默认方法(`default`关键字修饰)静态方法(`static`关键字修饰),这增强了接口的功能范围[^5]。 --- #### 二、主要区别 | 特性 | 抽象类 | 接口 | |-------------------|------------------------------------------|-----------------------------------------| | 定义方式 | `abstract class` | `interface` | | 方法实现 | 可以包含抽象方法非抽象方法 | JDK 1.8之前仅能包含抽象方法;之后可含默认方法静态方法 | | 成员变量 | 支持普通成员变量 | 不支持普通成员变量,默认为`public static final`常量 | | 继承/实现 | 类只能单继承一个抽象类 | 类可以实现多个接口 | | 构造函数 | 可以有构造函数 | 不能有构造函数 | | 访问控制符 | 抽象方法可以有不同的访问级别 (`private`, `protected`) | 所有方法均为`public` | --- #### 三、语法示例 ##### 抽象类示例 ```java // 定义抽象类 abstract class Animal { private String name; public Animal(String name) { this.name = name; } // 非抽象方法 public void eat() { System.out.println(name + " is eating."); } // 抽象方法 public abstract void makeSound(); } // 子类实现抽象方法 class Dog extends Animal { public Dog(String name) { super(name); } @Override public void makeSound() { System.out.println("Bark"); } } ``` ##### 接口示例 ```java // 定义接口 public interface SearchEngine { // 默认为public abstract String search(String query); // JDK 1.8新增默认方法 default void logSearch(String query) { System.out.println("Searching for: " + query); } // 静态方法 static void displayInfo() { System.out.println("This is a search engine."); } } // 实现接口 class Google implements SearchEngine { @Override public String search(String query) { return "Google results for '" + query + "'"; } } ``` --- #### 四、适用场景分析 1. **抽象类适合的情况** - 当需要提供部分通用逻辑给子类时,可以选择抽象类。因为抽象类不仅可以定义抽象方法,还可以包含已实现的具体方法。 - 如果希望强制子类遵循某种特定的行为模式,同时又想让这些子类共享某些公共状态或行为,则应优先考虑抽象类[^3]。 2. **接口适合的情况** - 多功能性需求:当某个类需要具备多种能力而不仅仅是单一职责的时候,比如既是一个支付网关又是日志记录器,那么可以通过实现多个接口达成目标。 - 松耦合设计:如果希望模块之间保持较低程度依赖关系的话,通常会倾向于采用基于接口设计方案而不是直接关联到具体的类上[^1]。 --- #### 五、总结说明 尽管两者都能达到一定程度上的抽象效果,但从灵活性角度来看,接口更适合作为一种契约式的存在服务于不同业务领域之间的交互操作;而对于那些内部紧密相连且需保留一定基础功能的对象建模而言,抽象类无疑更为合适[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值