Effective Java笔记(20)接口优于抽象类

《Effective Java》第20条:接口优于抽象类 但是JDK源码中的 AbstractList 骨架实现类已经帮我们写好了很多的方法,只需要子类实现 get(int index) 和 size() 这两个最基本的方法(因为这两个方法没有通用实现,完全依赖具体列表的存储逻辑),基于 get 和 size,为 iterator、contains、indexOf、subList 等方法提供了默认实现(这些方法的逻辑是通用的),那么这个时候,我们只需要继承 AbstractList 骨架类,然后重写我们需要的方法即可。即使是使用组合方式,也不是一件容易的事情, 阅读详情

        Java提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。自从Java 8为继承引入了缺省方法( default method),这两种机制都允许为某些实例方法提供实现。主要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。因为Java只允许单继承,所以用抽象类作为类型定义受到了限制。任何定义了所有必要的方法并遵守通用约定的类,都允许实现一个接口,无论这个类是处在类层次结构中的什么位置。

        现有的类可以很容易被更新,以实现新的接口。如果这些方法尚不存在,你所需要做的就只是增加必要的方法,然后在类的声明中增加一个implements子句。例如,当Comparable、Iterable 和Autocloseable接口被引入Java平台时,更新了许多现有的类,以实现这些接口。一般来说,无法更新现有的类来扩展新的抽象类。如果你希望两个类扩展同一个抽象类,就必须把抽象类放到类型层次( type hierarchy) 的高处,这样它就成了那两个类的一个祖先。遗憾的是,这样做会间接地伤害到类层次,迫使这个公共祖先的所有后代类都扩展这个新的抽象类,无论它对于这些后代类是否合适。

        接口是定义mixin (混合类型)的理想选择。不严格地讲,mixin 类型是指:类除了实现它的“基本类型”之外,还可以实现这个mixin类型,以表明它提供了某些可供选择的行为。例如Comparable是一个mixin接口,它允许类表明它的实例可以与其他的可相互比较的对象进行排序。这样的接口之所以被称为mixin,是因为它允许任选的功能可被混合到类型的主要功能中。抽象类不能被用于定义mixin,同样也是因为它们不能被更新到现有的类中:类不可能有一个以上的父类,类层次结构中也没有适当的地方来插入mixin。

        接口允许构造非层次结构的类型框架。类型层次对于组织某些事物是非常合适的,但是其他事物并不能被整齐地组织成一个严格的层次结构。例如,假设我们有一个接口代表一个singer (歌唱家),另一个接口代表一个songwriter (作曲家):
 

public interface Singer {
    AudioClip sing(Song s);
}
public interface Songwriter {
    Song compose(int chartPosition);
}

        在现实生活中,有些歌唱家本身也是作曲家。因为我们使用了接口而不是抽象类来定义这些类型,所以对于单个类而言,它同时实现Singer和Songwriter是完全允许的。实际上,我们可以定义第三个接口,它同时扩展Singer和Songwriter,并添加一些适合于这种组合的新方法:

public interface SingerSongwriter extends Singer, Songwriter {
    AudioClip strum();
    void actSensitive();
}

        也许并非总是需要这种灵活性,但是一旦这样做了,接口可就成了救世主。另外一种做法是编写一个臃肿( bloated)的类层次,对于每一-种要被支持的属性组合,都包含一个单独的类。如果在整个类型系统中有n个属性,那么就必须支持2”种可能的组合。这种现象被称为“组合爆炸”(combinatorialexplosion)。类层次臃肿会导致类也臃肿,这些类包含许多方法,并且这些方法只是在参数的类型上有所不同而已,因为类层次中没有任何类型体现了公共的行为特征。

        通过第18条中介绍的包装类(wrapperclass)模式,接口使得安全地增强类的功能成为可能。如果使用抽象类来定义类型,那么程序员除了使用继承的手段来增加功能,再没有其他的选择了。这样得到的类与包装类相比,功能更差,也更加脆弱。

        当一个接口方法根据其他接口方法有了明显的实现时,可以考虑以缺省方法的形式为程序员提供实现协助。通过缺省方法可以提供的实现协助是有限的。虽然许多接口都定义了object方法的行为,如equals和hashCode,但是不允许给它们提供缺省方法。而且接口中不允许包含实例域或者非公有的静态成员(私有的静态方法除外)。最后一点,无法给不受你控制的接口添加缺省方法。

        但是,通过对接口提供一个抽象的骨架实现( skeletal implementation)类,可以把接口和抽象类的优点结合起来。接口负责定义类型,或许还提供一些缺省方法,而骨架实现类则负责实现除基本类型接口方法之外,剩下的非基本类型接口方法。扩展骨架实现占了实现接口之外的大部分工作。这就是模板方法。

        按照惯例,骨架实现类被称为AbstractInterface,这里的Interface是指所实现的接口的名字。例如,Collections Framework为每个重要的集合接口都提供了一个骨架实现,包括AbstractCollection、AbstractSet、AbstractList和AbstractMap。将它们称作SkeletalCollection、SkeletalSet、 SkeletalList 和SkeletalMap也是有道理的,但是现在Abstract的用法已经根深蒂固。如果设计得当,骨架实现(无论是单独一个抽象类,还是接口中唯-包含的缺省方法)可以使程序员非常容易地提供他们自己的接口实现。例如,下面是一个静态工厂方法,除AbstractList之外,它还包含了一个完整的、功能全面的List实现:

static List<Integer> intArrayAsList(int[] a) {
    Objects. requireNonNull(a);
    return new AbstractList<>() {
        @Override 
        public Integer get(int i) {
            return a[i];
        }
        @Override 
        public Integer set(int i, Integer val) {
            int oldVal = a[i];
            a[i] = val;
            return oldVal;
        }
        @Override 
        public int size() {
            return a.length;
        }
    };
}

        如果想知道一个List实现应该为你完成哪些工作,这个例子就充分演示了骨架实现的强大功能。顺便提一下,这个例子是个Adapter,它允许将int数组看作Integer实例的列表。由于在int值和Integer实例之间来回转换需要开销,它的性能不会很好。注意,这个实现采用了匿名类(anonymous class)的形式。

        骨架实现类的美妙之处在于,它们为抽象类提供了实现上的帮助,但又不强加“抽象.类被用作类型定义时”所特有的严格限制。对于接口的大多数实现来讲,扩展骨架实现类是个很显然的选择,但并不是必须的。如果预置的类无法扩展骨架实现类,这个类始终能手工实现这个接口。同时,这个类本身仍然受益于接口中出现的任何缺省方法。此外,骨架实现类仍然有助于接口的实现。实现了这个接口的类可以把对于接口方法的调用转发到一个内部私有类的实例上,这个内部私有类扩展了骨架实现类。这种方法被称作模拟多重继承( simulated multiple inheritance),它与第18条中讨论过的包装类模式密切相关。这项技术具.有多重继承的绝大多数优点,同时又避免了相应的缺陷。

        编写骨架实现类相对比较简单,只是过程有点乏味。首先,必须认真研究接口,并确定哪些方法是最为基本的,其他的方法则可以根据它们来实现。这些基本方法将成为骨架实现类中的抽象方法。接下来,在接口中为所有可以在基本方法之.上直接实现的方法提供缺省方法,但要记住,不能为object方法(如equals和hashCode)提供缺省方法。如果基本方法和缺省方法覆盖了接口,你的任务就完成了,不需要骨架实现类了。否则,就要编写一个类,声明实现接口,并实现所有剩下的接口方法。这个类中可以包含任何非公有的域,以及适合该任务的任何方法。

        以Map.Entry接口为例,举个简单的例子。明显的基本方法是getKey、getValue和(可选的) setValue。接口定义了equals和hashCode的行为,并且有一个明显的toString实现。由于不允许给object方法提供缺省实现,因此所有实现都放在骨架实现类中:

public abstract class AbstractMapEntry<K, V>
        implements Map.Entry<K,V> {

    @Override
    public V setValue(V value) {
        throw new UnsupportedOperationException();
    }
    @Override
    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof Map.Entry))
            return false;
        Map.Entry<?,?> e = (Map.Entry) o;
        return Objects.equals(e.getKey(), getKey())
                && Objects.equals(e.getValue(), getValue());
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());
    }
    @Override
    public String toString() {
        return getKey() + "=" + getValue();
    }
}

        注意,这个骨架实现不能在Map.Entry接口中实现,也不能作为子接口,因为不允许缺省方法覆盖object方法,如equals、hashCode和toString。因为骨架实现类是为了继承的目的而设计的,所以应该遵从第19条中介绍的所有关于设计和文档的指导原则。为了简洁起见,上面例子中的文档注释部分被省略掉了,但是对于骨架实现类而言,好的文档绝对是非常必要的,无论它是否在接口或者单独的抽象类中包含了缺省方法。

        骨架实现上有个小小的不同,就是简单实现( simple implementation), AbstractMap.SimpleEntry就是个例子。简单实现就像骨架实现一样,这是因为它实现了接口,并且是为了继承而设计的,但是区别在于它不是抽象的:它是最简单的可能的有效实现。你可以原封不动地使用,也可以看情况将它子类化。

        总而言之,接口通常是定义允许多个实现的类型的最佳途径。如果你导出了一个重要的接口,就应该坚决考虑同时提供骨架实现类。而且,还应该尽可能地通过缺省方法在接口中提供骨架实现,以便接口的所有实现类都能使用。也就是说,对于接口的限制,通常也限制了骨架实现会采用的抽象类的形式。

codesys【modbusRTU】主站 【代码】modbusRTU【codesys】 阅读详情

相关推荐

数据分析:美团大赛的具体案例制作

在数据集中,存在三个变量的经纬度数据,分别是商家的经纬度数据('sender_lng', 'sender_lat'),顾客的经纬度数据('recipient_lng', 'recipient_lat')和骑手的经纬度数据('grab_lng', 'grab_lat')。根据结果可知,平台订单创建时间的中位数为2022-10-21 02:59:01,平台订单创建时间的众数为2022-10-19 03:29:41、2022-10-23 03:29:47,与直方图相符。接下来,我们对是否为预定订单变量进行分析。

m0_68269346的博客 2497

【第16条】接口优于抽象类

    Java语言提供了两种机制,可以用来定义一个允许多个实现的类型:接口和抽象类。如果对它们的基本定义还不是很清楚请参考其它书籍。       接口和抽象类这二者比较起来,从特征来说,最明显的区别在于抽象类允许包含某些方法的实现,但是接口是不允许的。但是在使用方面还有一个更为突出的区别,就是抽象类是通过被子类继承来使用的;而接口是通过被实现来使用的。而Java是一种单继承机制的语言,所以就...

从Java看编程 389

超10万,两台Mac Studio在家就能跑满血DeepSeek,网友:这是性价比最高的大模型一体机

在AI计算领域,没有比这更强的个人电脑了。这要从它的架构说起。对于那些有本地部署满血版DeepSeek需求的用户,目前建议的配置是选购512GB统一内存 + 1TB SSD,搭载M3 Ultra芯片的Mac Studio,官网售价74249元,可以叠加国补、教育优惠、12期分期等,这可能是目前门槛最低、性价比最高的满血版DeepSeek本地部署方案。对于企业而言,尽管Mac Studio确实可以部署6000亿参数的大模型,但在内存带宽、模型精调服务等方面,跟专用的大模型一体机仍有差距,采购需要谨慎评估。

2501_90444774的博客 1917

第18条:接口优于抽象类

Java语言设计提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。 因为Java只允许单继承,所以抽象类作为类型定义受到了极大的限制。 现有的类可以很容易被更新,以实现新的接口。 一般来说,无法更新现有的类来扩展新的抽象类。如果你希望两个类来扩展一个抽象类,就必须把抽象类放到类型层次的高处,以便这两个类的一个祖先成为他的子类。这样会间接的伤害到类的层次,迫使这个公共祖先的所有后代...

爱.NET 148

ai数字人系统部署

这段代码实现了基本的语音交互闭环,用户通过语音输入问题,数字人识别语音后进行自然语言理解并生成回复,再将回复转换为语音输出。但实际应用中的 AI 数字人系统更为复杂,如形象渲染需专业图形引擎(如 Unity、Unreal Engine),自然语言处理也会涉及更复杂的模型微调及多轮对话管理等。一个完整的 AI 数字人系统涵盖形象生成、自然语言处理、动作控制等多个复杂功能,下面为你提供一个 Python 示例,整合多个库来实现数字人基础功能,包括语音交互、简单的自然语言理解以及通过虚拟形象展示对话。

weixin_ggwwsscc的博客 369

解密m3u8视频合并:从猫抓插件到本地文件修改全流程

本文详细解析了m3u8视频合并的全流程,特别针对加密视频片段提供了解决方案。从使用猫抓插件捕获m3u8文件地址,到利用N_m3u8DL-CLI工具自动下载、解密并合并ts片段,手把手教你处理AES-128加密等常见问题,最终生成完整的本地MP4文件,适合需要备份或处理流媒体资源的用户。

weixin_29290947的博客 1362

Effective Java学习笔记(四)

[color=blue][size=large][b]第四章:类和接口(条目13-22)[/b][/size][/color] 类和接口是Java程序设计的核心,Java语言提供了许多强大的基本元素,供程序员来设计类和接口。 本章阐述的一些指导原则,可以帮助你更好地利用这些元素,设计出更加有用、健壮和灵活的类/接口。 [b][size=medium][color=...

chasegalaxy的专栏 192

IIS - 会话cookie中缺少HttpOnly属性

不啰嗦,我们直接开始! 先进行常规设置 打开配置编辑器 选中图中节点,将httpOnlyCookies设置为true 然后。。。不起作用。。。 换种方式 通过配置出站规则getcookie添加HttpOnly 在Web.config中添加如下出站规则 <rewrite> <outboundRules> <rule name="Add HttpOnly"> <match serverVa.

。 21万+

接口优于抽象类

《Effective Java》第20条:接口优于抽象类。 原因一:现有的类可以很容易被更新,以实现新的接口 现有的类想实现新的功能,可以继承一个或者多个接口即可。而如果一个已经继承了某个超类的类,不可能再去继承一个抽象类,只能继承接口。从这个角度而言,一个类无论是否继承了超类,都可以很方便的通过继承接口来扩展自身。 原因二:接口是定义 mixin (混合类型)的理想选择 混合类型,我找了...

sinat_36171694的博客 850

6.3 节深度拆解:Hermes Agent 多 Agent 协同执行链路的 4 层设计逻辑

拆解 Hermes 多 Agent 协同的 4 层工程化设计(协议层、编排层、执行层、适配层),聚焦协议层的强约束消息 Schema 如何解决 Agent 间语义不一致问题,并提供 `soul.md` 配置、GLM-4.7Flash 结构化输出验证及 v0.13.0/v0.14.0 版本实操避坑指南

weixin_42520239的博客 122

基于simulink的软开关技术的三相逆变器仿真

三相逆变器中的软开关技术(Soft Switching Techniques)旨在减少开关损耗,提高效率,并降低电磁干扰(EMI)。实现软开关通常涉及使用谐振电路或准谐振电路来确保开关器件在零电压(Zero Voltage Switching, ZVS)或零电流(Zero Current Switching, ZCS)条件下进行切换。下面将详细介绍如何在Simulink中进行基于软开关技术的三相逆变器仿真设计。

xiaoheshang_123的博客 162

【笔记20】接口优于抽象类

接口和抽象用来定义允许多个实现的类型。 两种机制之间最明显的区别在:① 抽象类允许包含某个方法的实现,而接口则不允许。②为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。Java只允许单继承,所以,抽象类作为类型定义受到了极大限制。 接口的优点: 现在的类可以很容易的被更新,以实现新的接口。如果这些方法尚不存在,你需要做的就只是增加必要的方法,然后在类的声明中增加一个implemen...

u013773608的博客 421

Matlab仿真:均匀面阵方向图、均匀线阵方向图、均匀圆阵方向图

其中,阵列方向图是评价阵列性能的重要参数之一。均匀面阵由若干个相同的阵元构成,阵元间等距排列,阵元的方向图形状为一个圆盘。均匀线阵由若干个相同的阵元构成,阵元间等距排列,阵元的方向图形状为一个矩形。本文将采用Matlab进行仿真,分别实现均匀面阵方向图、均匀线阵方向图和均匀圆阵方向图,并对三种阵列进行比较分析。通过以上代码仿真,我们可以对均匀面阵、均匀线阵和均匀圆阵进行方向图的绘制,进一步分析不同阵列在天线性能方面的差异。Matlab仿真:均匀面阵方向图、均匀线阵方向图、均匀圆阵方向图。

2301_79326857的博客 3436

Effective Java笔记:接口优于抽象类

在 《Effective Java 第三版》中,作者 Joshua Bloch 对“接口优于抽象类”这一原则有着深入的探讨。在理解“接口优于抽象类”之前,我们需要明确二者的本质区别:书中的核心观点是:接口提供了更大的灵活性、更广泛的适用性以及更好的未来兼容性。因此,Joshua Bloch 在条目20中推荐开发者优先选择接口,原因如下:示例:接口的多重继承 相比抽象类,接口让一个类可以轻松拥有“多个行为”(复合式能力),而不需要受到单继承的限制。 书中例子常见的场景: 和 模式相比抽象类,接口更加关注对

eclipseC的博客 1021

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《Effective Java》解读第20条:接口优于抽象类

摘要: 本文探讨了接口优于抽象类的设计原则。接口提供了更灵活的多态实现方式,允许构建非层级结构类型框架和混合类型。通过示例展示了如何用抽象类定义共性特征,用接口定义行为。文章分析了接口的四大优势:易扩展性、非层级结构、混合类型支持和包装类模式。同时指出接口的局限性,如无法提供Object方法默认实现。解决方案是结合接口和骨架实现类(Abstract[InterfaceName]),既保留接口灵活性又共享实现代码。这种"接口+骨架类"模式是构建健壮、可扩展组件的有效方式。

Cosmoshhhyyy的博客 800

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Effective Java 类和接口 第18条:接口优于抽象类

java程序设计语言提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。这两种机制之间最明显的区别在于,抽象类允许包含某些方法的实现,但是接口不允许,一个更重要的区别在于,为了实现抽象定义的类型,类必须成为抽象类的子类,任何一个类,只要它定义了所有必要的方法,并且遵守通用约定,它就被允许实现一个接口,而不管这个类是处于类层次的那个位置。可以Java只允许单继承,所以抽象类作为类型定义受到...

yancyang的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java:Effective java学习笔记之 接口优于抽象类

Java接口优于抽象类接口优于抽象类1、接口和抽象类2、接口优点3、骨架类3.1、demo参考 接口优于抽象类 1、接口和抽象类 Java中抽象类和接口的区别 2、接口优点 1、现有的类可以很容易的被更新,以实现新的接口。 如果你前期编写了一个类A,后期有在系统中加入了一个新的接口B,当你想让前期编写的类来实现这个接口,你只用加上一句implement B,然后在类A中实现里面的方法即可,不会影响到以前的类对类A的使用。 2、接口是定义mixin(混合类型)的理想选择。 这一条主要说的是,一个类可以实

JMW1407的博客 607

Effective Java---20 接口优于抽象类

前言 Java有两种机制允许多个类型的实现来进行扩展:接口和抽象类。抽象类即用abstract关键字修饰的类,它的特点是可以存在抽象方法,也可以存在普通方法;接口是用interface关键字修饰的,在Java 8之前只能有抽象方法,在Java 8中允许使用default关键字修饰的普通方法存在,在结构上和抽象类类似,但是抽象类有构造方法的,虽然不能直接实例化,接口就没有。 Java的单继承多实现 接口优于抽象类的最主要原因就是Java是单继承的,在一定程度上限制了扩展性,限制了它们作为类型定义的使用,我们不

weixin_44212383的博客 227

Effective Java 接口优于抽象类

Java有两种机制来定义允许多个实现的类型:接口和抽象类。 由于在Java 8 [JLS 9.4.3]中引入了接口的默认方法(default methods ),因此这两种机制都允许为某些实例方法提供实现。 一个主要的区别是要实现由抽象类定义的类型,类必须是抽象类的子类。 因为Java只允许单一继承,所以对抽象类的这种限制严格限制了它们作为类型定义的使用。 任何定义所有必需方法并服从通用约定的类都可以实现一个接口,而不管类在类层次结构中的位置。 现有的类可以很容易地进行改进来实现一个新的接口。 你只需添加

菜园子丶For丨丶Tomorrow的博客 216

《Effective Java》阅读笔记 18接口优于抽象类

接口和抽象类 抽象类允许某些方法的实现,但是接口不允许(JDK 1.8 已经运行了) 现有类必须成为抽象类的子类,但是只能单继承,接口可以多继承 抽象类小优势 抽象类并非一无是处,它的改变就比接口要简易的多,实际使用时也是体验很好的一种设计方法,不过抽象类的使用也要有所衡量,只有在确实是属于一个类别的类时才好去使用抽象类,否则就违背了我们的编程原则 接口优点 现有类可以很容易被更新,以实现新的接口 只需要在接口中添加方法就可以了 接口是定义 mixin (混合类型)的理想选择 mixin:类除了

weixin_41563161的博客 480

effective java:接口优于抽象类

1,已有的类更容易实现新接口,而实现新的抽象类十分困难 假如,你需要让已有的类 class N拥有一个全新的类型,以便其作为组件用在某程序中,你有两个选择。 1,实现一个接口interface A,implements+具体方法即可。 2,继承一个抽象类 abstract class A,如果这个已有的类没有直接父类,直接extends即可,但是,很多情况,已有类是有直接父类的,此路不通。怎么办...

qq_36667796的博客 211

Effective Java笔记第三章类和接口第六节接口优于抽象类

Effective Java笔记第三章类和接口 第六节接口优于抽象类 1.java程序设计语言提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。这两种机制之间最明显的区别在于,抽象类允许包含某些方法的实现,但是接口则不允许,一个更为重要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。任何一个类,只要它定义了所有必要的方法,并且遵守通用约定,他就被允许实现一个接口,而不管这个类是处于类层次的哪个位置。因为java只允许单继承,所以,抽象类作为类型定义受到了极大的限制。 2.现有

zh123456_789的博客 270

接口优于抽象类——《effective Java》第三版

Java 提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。自从 Java 为继承引人了缺省方法(default method),这两种机制都允许为某些实例方法提供实现。主要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。因为 Java只允许单继承,所以用抽象类作为类型定义受到了限制。任何定义了所有必要的方法并遵守通用约定的类,都允许实现一个接口,无论这个类是处在类层次结构中的什么位置。 现有的类可以很容易被更新,以实现新的接口。如果这些方法...

m0_65546127的博客 874

Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25

Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25 本文主要介绍了类和接口相关的内容

weixin_44453385的博客 883

Effective Java - 类和接口 - 接口优于抽象类

读书笔记 仅供参考接口和抽象类 抽象类允许某些方法的实现,但是接口不允许(JDK 1.8 已经运行了) 现有类必须成为抽象类的子类,但是只能单继承,接口可以多继承 接口优点现有类可以很容易被更新,以实现新的接口只需要在接口中添加方法就可以了接口是定义 mixin (混合类型)的理想选择mixin:类除了实现它的“基本类型”之外,还可以实现 mixin 类型,表明它提供了可供选择的行为,例如 Comp

wujunyucg的博客 444

Effective Java 18:接口优于抽象类 Prefer interfaces to abstract classes

Java程序设计语言提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类 因为Java只允许单继承,所以抽象类作为类型定义受到了极大的限制 ——————————————————————————————————————————————— 现有的类可以很容易地被更新,以实现新的接口 一般来说,无法更新现有的类来扩展新的抽象类 如果你希望让两个类扩展同一个抽

439
上一篇: Effective Java笔记(19)要么设计继承并提供文档说明,要么禁止继承
下一篇: Effective Java笔记(21)为后代设计接口
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值