首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么List不是简单地定义为抽象类而不是接口?

这个问题涉及到Java编程语言中的List抽象数据类型的设计。在Java中,List是一个接口,而不是一个抽象类。这是因为接口具有以下优势:

  1. 接口可以被多个类实现,而抽象类只能被继承一次。这使得Java的类继承层次结构更加清晰,有助于代码的可读性和可维护性。
  2. 接口可以被多个接口继承,这使得Java的接口层次结构更加清晰,有助于代码的可读性和可维护性。
  3. 接口可以被任何类实现,而抽象类只能被子类实现。这使得Java的类和接口之间的关系更加灵活,有助于代码的可扩展性和可维护性。
  4. 接口可以定义默认方法,这使得Java的接口可以具有一定的实现细节,同时也允许接口的实现类自由地选择是否重写这些默认方法。

因此,使用接口而不是抽象类来定义List数据类型,可以更好地支持代码的可读性、可扩展性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 waitnotifynotifyAll 在 Object 类定义不是 Thread 类?

为什么在 Object 类中定义 wait 和 notify 方法,每个人都能说出一些理由。...因此,如果你去参加 Java 面试,请确保对 wait 和 notify 机制有充分的了解,并且可以轻松使用 wait 来编写代码,并通过“生产者-消费者”问题或实现阻塞队列等了解通知的机制。...2) 每个对象都可上锁,这是在 Object 类不是 Thread 类中声明 wait 和 notify 的另一个原因。...3) 在 Java 中,为了进入代码的临界区,线程需要锁定并等待锁,他们不知道哪些线程持有锁,只是知道锁被某个线程持有, 并且需要等待以取得锁, 不是去了解哪个线程在同步块内,并请求它们释放锁。...线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。

1.5K20
  • 面试专题:MySQL为什么把节点大小设置16K,不是更大?

    MySQL 选择将节点大小设置 16KB 不是更大的原因,主要是为了在内存管理、性能、磁盘 I/O 效率、适应性和兼容性之间取得平衡。...本文将从讲解页的结构开始,然后分析为什么MySQL为什么把节点大小设置16K,不是更大?页结构实战页包括:前指针,后指针,页头,页目录,用户数据。默认插入数据按照主键排序,所以主键设计递增。...,也就是说一个索引后面配对一个节点地址,成对出现(见B树), 我们一个页中能存放多少这样的单元,其实就代表有多少指针,可以算一下16K的节点可以存多少对也就是多少个索引,8b+6b=14b, 一棵高度2...高度3,(第二层)有1170个子节点,(第二层)每个子节点又有1170个子节点,一共有1170*1170个指针(节点),每个指针(节点)放16个数据。

    98510

    Java基础重构-面向对象

    在java8里,允许接口定义默认方法,类方法。 接口从宏观上来说,是从多个相似类中抽象出来的规范,接口不提供任何实现。说简单点,接口反映的是一类事物的方法。...为什么静态内部的实例方法也不能访问外部类的实例属性? 因为静态内部类是外部类的类相关的,不是外部类的对象相关的。也就说说,静态内部类对象不是寄生在外部类的实例中,而是寄生在外部类的本身中。...枚举类与普通类之间有如下区别: 枚举类可以实现一个或多个接口,使用 enum 定义的枚举类默认集成了 java.lang.Enum 类,不是默认集成 Object 类,因此枚举类不能显示继承其他父类...枚举类不是用 final 修饰吗,为什么还可以派生子类?...abstart 关键字将枚举类定义抽象类(因为系统自动会为它添加 abstart 关键字),但因为枚举类需要显示创建枚举值不是作为父类,所以定义每个枚举值时必须抽象方法提供实现,否则将出现编译错误

    65030

    我是如何理解Java抽象类接口的?

    抽象类接口这篇文章讲到了他们的区别和联系,它们确实有很多相似的地方,但是从本质上看,或从语言的设计角度来看,这不是它们最本质的区别。...不卖关子,我个人对这两个的理解: 类是具体实例的抽象,比如一个json字符串的抽象;抽象类就是类的抽象;接口就是抽象类的抽象,接口更像是一种协议 听我慢慢道来~ 吐槽 首先,我必须吐槽一下这种面试,我认为面试官凡事问出这种类似...-) 抽象类接口的区别 说到抽象类接口,就必须要说到类。 一个类就是对现实事物的抽象。 比如定义一个BenzCar类,就需要对现实的奔驰汽车有很好的抽象(当然奔驰汽车有好多系列,这里不钻牛角尖)。...其实程序中也一样,比如所有的交通工具可以抽象一个接口Drivable(可能由于经验原因,我考虑的不是很完善),表示实现这个接口的类创建的对象(比如:汽车,飞机,轮船等等)都是可以驾驶的 public...最后 为什么接口可以继承? 其实这个原理很简单。因为总有一个最本质的协议来约束大家,比如所有的交通工具都是可以驾驶的,所有的容易都是可以遍历的。

    798100

    Java面试参考指南(一)

    在这个例子中,每个类中都拥有一个自己的Draw()函数,客户端程序代码可以简简单如下所示: ?...在这个例子中,每个类中都拥有一个自己的Draw()函数,客户端程序代码可以简简单如下所示: ?...抽象类定义了一些默认的行为,而将具体的功能留给子类来实现。例如:List是一个接口抽象类AbstractList提供了List的默认方法,这些默认方法可以被子类ArrayList继承或重新定义。...接口抽象类之间的区别 接口是一种协议,要实现接口的类需要根据接口定义来实现接口,它只是一个提供了方法声明的空壳; 抽象类定义了一些通用方法,其子类可以定义新的具体或特殊的方法; 抽象类中的方法和参数可以被定义成任何可见性的...,接口中的所有方法必须由public可见性修饰符定义; 继承一个抽象类,子类需要实现其中的抽象方法,然而接口可以扩展另一个接口而无需实现其中的方法; 子类只能继承单个抽象类一个接口或类可以实现多个接口

    68930

    排队的时候请学习List 不要做Set

    如果我们在内存中直接集合划分一个空间,然后将对象装入集合,那么这些对象就是有组织,有纪律的对象。 ? 使用集合对比 左边是没有容器来约束的,所以对象都是随机存储。...数组不是也是用来装东西的么?那用数组不是就够了,为什么还要用集合呢? 我们首先来回忆一下数组的定义方式。...首先,不管我们定义一个什么结构的集合,他们都有共同的特点,那就是可以将集合里面的元素一个个数出来,也就是可以遍历。具体怎么数我不管,能数就行。是不是很自然的想到了接口?...集合都可以有一些公共的操作,比如转为数组,清空数组等操作,这时候是不是抽象类出场了?抽象类实现公共方法给子类调用,但是又有部分方法需要到具体的实现类才能实现,所以使用抽象类不是直接实现所有接口。...最后的常用实现类终于登场了,ArrayList和HashSet是最常用的List和Set接口的实现。通过继承AbstractList和AbstractSet,他们获得了抽象类的公共方法。

    38120

    接口抽象类,傻傻分不清楚?

    接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),抽象类是可以有静态代码块和静态方法的。 一个类只能继承一个抽象类一个类却可以实现多个接口。...抽象类是可以有自己的方法的,但继承它的子类可以忽视。 接口 接口是一种比抽象类更加抽象的“类”,毕竟是用关键字 interface 声明的,不是用 class。...; } } 接口抽象类的补充,Java 为了保证数据的安全性不允许多重继承,也就是说一个类同时只允许继承一个父类(为什么呢?请搜索关键字“菱形问题”)。...; } } 03、 通过上面举的例子,是不是接口抽象类有比较清晰的认知了?如果还没有,来来来,我们再来比较一下接口抽象类之间的差别。 ? 究竟什么时候使用接口,什么时候使用抽象类呢?...3、接口添加任何方法(抽象的),相应的所有实现了这个接口的类,也必须实现新增的方法,否则会出现编译错误。对于抽象类,如果添加了非抽象方法,其子类却可以坐享其成,完全不必担心编译会出问题。

    48730

    Java 基础巩固:再谈抽象类接口

    ,包括属性、行为,但是接口却是对类局部行为进行抽象 跨域不同 抽象类所跨域的是具有相似特点的类,接口却可以跨域不同的类 抽象类所体现的是一种继承关系,考虑的是子类与父类本质“是不是”同一类的关系...接口并不要求实现的类与接口是同一本质,它们之间只存在“有没有这个能力”的关系 设计层次不同 抽象类是自下而上的设计,在子类中重复出现的工作,抽象到抽象类接口是自上而下,定义行为和规范 如何选择...在进行选择时,可以参考以下几点: 若使用接口,我们可以同时获得抽象类以及接口的好处 所以假如想创建的基类没有任何方法定义或者成员变量,那么无论如何都愿意使用接口不要选择抽象类 如果事先知道某种东西会成为基础类...我们在写代码时追求的是“以不变应万变”,在需求变更时,尽可能少修改代码就可以实现。 而这,就需要模块之间依赖时,最好都只依赖对方给的抽象接口不是具体实现。...组合就是通过持有一个类的引用来拥有他的一切,不是继承,在需要调用他的方法时传入引用,然后调用,否则就清除引用。

    717100

    抽象类接口的区别

    本文中,作者通过多个方面深入剖析抽象类接口的区别,并结合经验供读者借鉴学习。 在开发人员岗位面试时,是否了解抽象类接口之间的基本区别是一个很重要的考量因素。 显而易见? 完全不是。...“如果多个类的继承如此糟糕,为什么它可以实现许多接口呢?”——如果这样的问题在你的脑海盘旋,我不得不承认这是一个绝妙的问题。 然而,答案很简单。每一个接口都是基于函数不是一个类去实现。...所以,即使实现十个不同的接口,每个包含相同的方法声明,内部也不会发生冲突。接口保证了方法的存在,不是去说明方法的实现,这意味着,只要不违反SRP,你完全可以实现多个接口。...方法的可见度 接口中的所有方法都是public的,但对于抽象类的声明并没有这样的规则,当然不能是private。为什么不能private?...声明和定义 接口只能包含方法声明,抽象类还可以包含方法的定义接口的重点在于提供特定函数,抽象类还在于子类实现的相似性,不仅仅是其中的函数。 常量 接口抽象类中都可以定义常量。

    800100

    如何理解 Java 中接口存在的意义

    前言 在我自己早期学习编程的时候,对接口存在的意义实在困惑,我自己乱写代码的时候基本上不可能意识到需要去写接口,不知道接口到底有什么用,为什么定义接口,感觉定义接口只是 提前做了个多余的工作。... Java 8 中接口出现了些许的变化,开始允许接口包含默认方法和静态方法,这个下文会讲解。 Java 使用关键字 interface 不是 class 来创建接口。...,为什么 Java 程序设计语言还要不辞辛苦引入接口这个概念?...因此,一般更倾向使用接口不是抽象类。 4. Java 8 接口新特性 上文提过一嘴,「在 Java 8 中,允许在接口中增加静态方法和默认方法」。...其实不是定义接口并非多余,「接口是用来提供公用的方法,规定子类的行为的」。

    1.3K10

    接口vs抽象类的区别?如何用普通的类模拟抽象类接口

    不过,并不是所有的面向对象编程语言都支持这两个语法概念,比如,C++ 这种编程语言只支持抽象类,不支持接口像 Python 这样的动态编程语言,既不支持抽象类,也不支持接口。...前面我们讲了抽象类接口定义,以及各自的语法特性。从语法特性上对比,这两者有比较大的区别,比如抽象类中可以定义属性、方法的实现,接口中不能定义属性,方法也不能包含代码实现等等。...刚刚我们学习了抽象类接口定义和区别,现在我们再来学习一下,抽象类接口存在的意义,让你知其然知其所以然。 首先,我们来看一下,我们为什么需要抽象类?它能够解决什么编程问题?...刚刚我们讲到,抽象类不能实例化,只能被继承。前面的章节中,我们还讲到,继承能解决代码复用的问题。所以,抽象类也是代码复用而生的。...不过,显然没有通过抽象类来的优雅。 其次,我们再来看一下,我们为什么需要接口?它能够解决什么编程问题? 抽象类更多的是为了代码复用,接口就更侧重于解耦。

    1.2K50

    设计模式之美 Part1

    要尽量避免滥用,不要不加思考随意去定义 Utils 类。...面向对象编程风格正好相反。它是一种自底向上的思考方式。 它不是先去按照执行流程来分解任务,而是将任务翻译成一个一个的小的模块(也就是类),设计类之间的交互,最后按照流程将类组装起来,完成整个任务。...从类的继承层次上来看,抽象类是一种自下而上的设计思路,先有子类的代码重复,然后再抽象成上层的父类(也就是抽象类)。接口正好相反,它是一种自上而下的设计思路。...实现类定义抽象的接口。 抽象意识、封装意识、接口意识。 10 继承层次过深、过复杂,也会影响到代码的可维护性。 鸟 -> 会飞、不会飞、会叫、不会叫、会下蛋、不会下蛋。...这也就意味着,我们要定义更多的类和接口。类和接口的增多也就或多或少增加代码的复杂程度和维护成本。 组合并不完美,继承也不是一无是处。

    21910

    C#设计模式09——组合模式的写法

    由于容器和叶子节点可以互换使用,可以轻松添加新的叶子节点和容器对象,不会影响其它部分代码的实现。 3. 组合模式的主要角色有哪些?...C#组合模式通常涉及四个主要角色: - 抽象组件(Component): 定义组合关系的抽象类接口容器和叶子节点共享的操作提供通用的实现。...组合模式的一个常见实现方案是将组件抽象成接口抽象类。这个抽象类包含容器和叶子节点的通用行为和属性,并定义了添加、删除和获取子节点的方法。...客户端代码使用这个抽象接口或类,不是具体的实现对象,实现了透明的管理树形结构元素。 5. 组合模式有哪些优缺点? 优点: - 可以方便地处理树状结构,具有一致性和可维护性。...- 通过共享相同接口抽象类,客户端代码可以无缝切换一个元素与多个元素之间的关系,从而简化代码逻辑。 - 允许在叶子和组合对象中分别添加新的行为和操作,不会影响其它部分的代码。

    16420

    集合系列(一):集合框架概述

    可以看到 Collection 接口定义了最最基本的集合操作,例如:判断集合大小、判断集合是否空等。List、Set、Queue 都继承了该接口。 ?...AbstractSequentialList 抽象类做了许多工作,使得后续的链表实现更加简单。...我们知道 Set 集合中的元素是无序的, SortedSet 接口则是定义了有序 Set 集合的接口 TreeSet 则是 SortedSet 的具体实现。...这个类已经被废弃,新的实现应该实现 Map 接口不是扩展这个类。 所以针对于 Dictionary 的实现,我们并不打算深入讲解。...当我们深入研究了集合的实现之后,我们知道了原来 List 接口就是 List 这种数据类型的定义 AbstractList 是 List 的抽象实现。

    62720

    C#设计模式03——简单工厂的写法

    什么是C#简单工厂? C#简单工厂是一种创建对象的设计模式,它定义一个工厂类来创建指定类型的对象,不是在客户端代码中直接创建对象。...简单工厂模式通常使用静态方法来生成对象,并且这些静态方法通常被称为工厂方法。 为什么要使用C#简单工厂? C#简单工厂模式的主要目的是隐藏创建对象的复杂性,并提供一个可控的对象创建过程。...C#简单工厂模式通常有两种实现方式,分别是基于接口和基于抽象类的实现方式。...- 基于接口的实现方式:将工厂类定义接口抽象类,然后在具体的工厂类中实现该接口或继承该抽象类,并根据客户端需求创建指定类型的对象。...- 基于抽象类的实现方式:将工厂类定义抽象类,并在该抽象类定义一个抽象的工厂方法,用于创建指定类型的对象。具体的工厂类实现该抽象类,并根据客户端需求实现工厂方法创建指定类型的对象。

    22030

    小朋友学Java(9):抽象类接口

    抽象方法的声明格式: abstract void fun(); 抽象方法必须用abstract关键字进行修饰。 为什么需要抽象方法呢?因为有些方法在父类里面很难给出具体的定义,只能通过子类来定义。...抽象类不能用来创建对象; 如果一个类继承于一个抽象类,则要么子类必须实现父类的抽象方法,要么必须将子类也定义abstract类。...但是要注意,接口中的变量会被隐式指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),方法会被隐式指定为public...从这里可以隐约看出接口抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口定义变量(虽然可以定义变量)。...从这里可以看出,继承是一个 “是不是”的关系,接口实现则是 “有没有”的关系 。

    58490

    一文彻底搞懂抽象类接口

    抽象类和抽象方法 抽象类,它是普通类和接口之间的一种中庸之道。可能大家看了这句话也有点懵,其实简单点说就是抽象类既有普通类的特征又有接口的特征。...; } } 上面就是一个很简单抽象类的实例了,抽象类Animal,我们可以看到它里面的内容,第一感觉是---这有啥用?感觉并没有什么用。那么为什么JAVA要引用抽象类这个概念呢?...因此,我们要实现一个接口时,在接口中被定义的方法必须被定义是public的;否则,它们将只是得到默认的包访问权限,这样在方法被继承的过程中,其可访问权限就被降低了,这样就会报错。 4....接口抽象类的变体,接口抽象类更加抽象,接口中所有的方 法都是抽象的。 每个类只能继承一个抽象类,但是可以实现多个接口 抽象类中不一定都是抽象方法,抽象的抽象类可以实现部分方法。...但是接口中方法必须public修饰的、抽象的不能实现具体的法。 接口中基本数据类型static 抽象类不是的。

    54230

    深入理解Java的接口抽象类

    也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计抽象类?所以暂且记住这个概念吧,不必去深究为什么。...2)抽象类不能用来创建对象;   3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义abstract类。   ...但是要注意,接口中的变量会被隐式指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),方法会被隐式指定为public...那么在设计的时候,可以将飞机设计一个类Airplane,将鸟设计一个类Bird,但是不能将 飞行 这个特性也设计类,因此它只是一个行为特性,并不是对一类事物的抽象描述。...从这里可以看出,继承是一个 "是不是"的关系, 接口 实现则是 "有没有"的关系。

    57750
    领券