接口(interface)原来是可以被继承(extends)的

在传统的教科书或者书籍中都会灌输我们一个观念,那就是抽象类可以被继承(extends),接口可以被实现(implements),但是抽象类不能被实现(implements),接口也不能被继承(extends),但是今天这个观点有些地方被颠覆了。

抽象类可以被继承(extends),接口可以被实现(implements),但是抽象类不能被实现(implements),这三个观点确实没有什么问题,但是接口却是可以被继承的,当然你也许会举一个类似下面的例子来证明接口是不能被继承的,代码如下:

确实上面的代码不能被编译通过,会出现以下错误:

也许你就想以上面的例子来证明我的观点是错误的,但是请看下面的例子:

看看图中高亮部分代码,它是可以通过编译的,下面的编译结果:

另外在C#中我也做过测试,因为在C#中实现和继承没办法从类似于java的implements或者extends关键字看出来,它都是用:符号来体现的,不过看具体代码还是可以看出来的,请看下面一段代码:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespaceDay2
{
interfaceInterfaceA
{
intAdd();
}

interfaceInterfaceB:InterfaceA
{
intMinus();
}
}

这段代码是可以在VS中编译通过的。

通过以上实例说明接口之间是可以继承的,也就是所谓的接口扩充,这样一来继承了一个接口的类就有了两个接口的方法。

总结:接口可以继承接口,类只能实现接口。

### 继承与实现的区别 #### 抽象类可以被继承 抽象类是一种特殊的类,它允许定义抽象方法(没有具体实现的方法)和具体方法(有实现的方法)。一个类可以通过继承抽象类来获得其所有成员,并且可以重写其中的方法以提供特定的行为。抽象类的构造方法用于在子类创建对象时调用,这使得抽象类能够为子类提供初始化逻辑[^2]。例如,在Java中,如果有一个名为`Animal`的抽象类,那么其他类如`Bird`或`Dog`可以直接继承这个抽象类并实现其抽象方法。 ```java abstract class Animal { abstract void makeSound(); void breathe() { System.out.println("Breathing..."); } } class Bird extends Animal { @Override void makeSound() { System.out.println("Chirping..."); } } ``` #### 接口只能被实现 接口是完全不同的概念,它主要用于定义一组方法签名而不包含任何具体的实现(尽管现代语言特性如Java 8之后允许默认方法和静态方法)。接口不能被继承,但可以通过`implements`关键字来实现。一个类可以实现多个接口,从而支持多重继承的效果。接口中的方法默认都是`public`的,并且接口不能拥有构造方法,因为它们不是类[^2]。下面是一个简单的例子,展示了一个接口如何被一个类所实现: ```java interface Flyable { void fly(); } class FlyingBird implements Flyable { @Override public void fly() { System.out.println("Flying..."); } } ``` ### 抽象类与接口继承与实现特性 - **继承关系**:抽象类支持单继承,这意味着一个类只能直接继承一个抽象类。相比之下,接口支持多实现,即一个类可以实现多个接口,这种机制提高了设计上的灵活性。 - **成员变量**:抽象类可以定义普通的成员变量,而接口只能包含静态常量(`public static final`)。 - **方法实现**:抽象类既可以包含抽象方法也可以包含具体方法,而接口通常只包含抽象方法(除非使用了默认方法或静态方法)。 - **构造方法**:抽象类有构造方法,这是为了在子类实例化时进行初始化;而接口没有构造方法[^2]。 - **访问权限**:抽象类中的成员可以有不同的访问权限(`public`, `protected`, `private`),而接口中的所有方法默认都是`public`的[^4]。 通过上述对比可以看出,抽象类更适合于需要共享代码和状态的情况,而接口则更适用于定义契约或者行为规范。选择使用抽象类还是接口取决于具体的设计需求以及对代码结构和可维护性的考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值