小鸦-Java8抽象类与接口的区别

前序: 被不少考官问过, 这次想重新整理一下.

首先, 我们必须明白, 「抽象类是」什么—- class, 也就是「类」!!
它和普通的类, 除了子类要实现 abstract method 以外, 没有任何区别!!

也就是, 我们的问题转换成 class与interface有什么区别?

1.class只能继承一个class ,可以实现若干interface
这一点, 强调了extend才是「主干」, 接口只是「辅助」. 以下就是为何extend是主干的原因.

Interface with default methods vs Abstract class in Java 8

1.Abstract class can have a constructor.
2.Abstract classes are more structured and can hold a state.

这里强调到「状态」 , 也就是我们说的「成员变量」.

interface A{

    default a(){ 
    //小鸦扫地
    }
    default b(){
    //小鸦拖地
    }
    default c(){
    //小鸦乱丢垃圾
    }
}

class B implement A{

    void c(){
    //小鸦的房间变成什么样了?
    }
}

相反, 类就可以实现了

class A{
    String a="";
    default a(){
    //小鸦扫地 
    this.a="变干净了,";
    }
    default b(){
    //小鸦丢垃圾
    this.a="变脏了,";
    }
}
class B extend A{

    void c(){
    System.out.println(super.a)
    //小鸦的房间变成这样啦
    }
}

从上面, 可以看见, 「接口没有状态」, 换句话就是「信息无法储存」. 同时, 需要强调的是, 「这里的信息储存是持久的」, 如果是暂时的话, 我们可以以下面方式实现, 也可以说这种信息是即时性. 也就是我们常说的硬链接.

   @SuppressWarnings({"unchecked", "rawtypes"})
    default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }

Java中的List接口, 实现sort功能. 从源码, 我们知道其实可以用method来代替Member variable来实现信息的传达(暂时地存储).

另外, 「信息的储存对于类与类之间的交互来说十分重要」,理由同上, 避免硬链接.

深入思考: 为什么interface不添加member variable?而只能能使用constants(常量)

同样, interface的作用在于「出」, 入口修改出口的数据, 这是违背了interface的原意. 而变量必须用final, 这一点, 我的理解, 就是method的实现是需要根据interface, 就好象充电宝, 要让其他设备充电, 也要设置一个USB口.
网上, 一些讨论偏向于, interface是contract. 这样说, 也是没错, 但是abstract class同样可以做contract. 所谓的契约, 就是规则. 这个范围太泛, 我不大能接受.
default的存在只是一种「patch(补丁)」

不大好的比喻, 就是 class是充电宝, interface和implement是USB口和各种数据线, 继承就是安卓口.

「接口是出口」 注重点为「暴露」
1. 以前的接口, 就只有几个method名, 没啥代码. 也就是对方只想知道这么多就够了, 其他不用给对方
2. 上司给部下若干interface, 上司只想看到结果是可行的, 测试员也是如此.

以上, 就是我对接口与类的认识

至于面向接口的编程等思路或者设计模式上的应用的产生, 我认为是后话.


总结: 接口是用于信息的出口, 而类相对是用于信息的入口

一文章 : http://hackthology.com/golangzhong-de-mian-xiang-dui-xiang-ji-cheng.html

继承机制曾在代码复用和数据共享的设计模式占据主导地位,但是目前组合这一古老的技术重新焕发了活力。

扩展: 为什么Java8要扩展default方法

(= =) 迟一点,再去看看其他语言, 是不是还在用继承, 还是说继承和接口实现合并起来.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值