接口与抽象方法的区别

- 成员区别
  - 抽象类
            变量,常量;有构造方法;有抽象方法,也有非抽象方法
  - 接口
            常量;抽象方法
- 关系区别
  - 类与类
            继承,单继承
  - 类与接口
            实现,可以单实现,也可以多实现
  - 接口与接口
            继承,单继承,多继承
- 设计理念区别
  - 抽象类
            对类抽象,包括属性、行为
  - 接口
            对行为抽象,主要是行为
    
    注:
    添加:在选择抽象类和接口时,有限选择接口,因为语法简单,但如果子类(实现类)有共同属性(成员变量)时,或子类(实现类)有相同方法且方法体一致时,选择抽象类,因为接口中成员变量被final修饰
    ,实现类不能更改,第二种情况时因为接口中的方法皆为抽象方法,实现类在调用时还需一次次重写,失去意义。
### 接口抽象方法的概念及区别 #### 1. **接口** 接口是一种特殊的抽象类,它仅包含抽象方法和常量。在 Java 中,接口用于定义一组行为规范,而不涉及具体的实现细节。任何实现了该接口的类都必须提供这些行为的具体实现。 - 接口中所有的方法默认都是 `public` 和 `abstract` 的,即使没有显式声明[^4]。 - 接口可以包含静态方法和默认方法(自 Java 8 起支持)[^3]。 - 实现接口的类需要使用 `implements` 关键字,并且必须实现接口中定义的所有方法[^5]。 ```java // 定义一个接口 public interface Employer { String getName(); // 抽象方法 double getSalary(); // 抽象方法 default void showInfo() { // 默认方法 System.out.println("This is an employer."); } } ``` --- #### 2. **抽象方法** 抽象方法是指只有方法签名而无具体实现的方法。它可以存在于抽象类或接口中。如果抽象方法位于抽象类中,则子类可以选择性地覆盖某些方法;但如果抽象方法位于接口中,则所有方法都必须被实现。 - 抽象方法所在的类必须声明为 `abstract` 类型[^2]。 - 子类继承抽象类时,要么实现所有的抽象方法,要么继续声明为抽象类。 ```java // 定义一个抽象类 public abstract class AbstractEmployer { public abstract String getName(); // 抽象方法 public abstract double getSalary(); // 抽象方法 public void displayDetails() { // 非抽象方法 System.out.println("Name: " + getName()); System.out.println("Salary: " + getSalary()); } } ``` --- #### 3. **接口抽象方法的主要区别** | 特性 | 接口 | 抽象类 | |---------------------|-----------------------------------|----------------------------------| | 方法实现 | 所有方法均为抽象方法 | 可以包含非抽象方法 | | 继承方式 | 使用 `implements` | 使用 `extends` | | 多重继承 | 支持多重继承 | 不支持多重继承 | | 成员变量 | 只能是 `static final` 常量 | 可以是非静态成员变量 | | 构造器 | 不允许构造器 | 允许构造器 | --- #### 4. **编程示例:对比接口抽象类的用法** ##### (1) 使用接口的方式 下面是一个基于接口的例子: ```java public interface EmployerInterface { String getName(); double getSalary(); default void showBonus() { System.out.println("No bonus defined."); // 默认实现 } } public class Employee implements EmployerInterface { private String name; private double salary; public Employee(String name, double salary) { this.name = name; this.salary = salary; } @Override public String getName() { return name; } @Override public double getSalary() { return salary; } @Override public void showBonus() { System.out.println("Employee Bonus: $100"); } } ``` ##### (2) 使用抽象类的方式 下面是基于抽象类的例子: ```java public abstract class EmployerAbstractClass { protected String name; protected double salary; public EmployerAbstractClass(String name, double salary) { this.name = name; this.salary = salary; } public abstract void showBonus(); public void showSalary() { System.out.println("Salary: $" + salary); } } public class Manager extends EmployerAbstractClass { public Manager(String name, double salary) { super(name, salary); } @Override public void showBonus() { System.out.println("Manager Bonus: $500"); } } ``` --- #### 总结 接口适合用来描述“能力”或“角色”,强调的是“做什么”。抽象类更适合表示一种基础结构,强调的是“是什么”。两者的选择取决于实际需求和设计目标[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值