【1】 抽象类(Abstract Class)和接口(Interface)是Java中两种不同的抽象机制
它们在实现上有一些区别。下面是它们之间的主要区别:
-
定义方式:
- 抽象类是用
abstract关键字定义的类,可以包含抽象方法(没有方法体,只有方法签名)和具体方法(有方法体的普通方法)。 - 接口是用
interface关键字定义的,它只能包含抽象方法和常量(public static final修饰的变量),并且方法默认是public和abstract的,变量默认是public、static和final的。
- 抽象类是用
-
继承关系:
- 一个类只能继承一个抽象类,使用
extends关键字来实现继承。 - 一个类可以实现多个接口,使用
implements关键字来实现接口。
- 一个类只能继承一个抽象类,使用
-
构造器:
- 抽象类可以有构造器,并且在创建子类对象时会调用其父类的构造器。
- 接口不能有构造器,因为接口是用来定义行为的规范,不包含实例化的概念。
-
成员变量:
- 抽象类可以有实例变量,可以是各种类型的变量,包括基本数据类型和引用类型。
- 接口中的变量默认是
public、static和final的,只能定义常量,而且变量的值不能在实现类中改变。
-
成员方法:
- 抽象类可以有抽象方法和具体方法(有方法体的方法)。
- 接口只能有抽象方法,实现类必须实现接口中的所有抽象方法。
-
多态性:
- 抽象类可以通过向上转型,使得其引用指向子类对象,实现多态性。
- 接口同样也可以通过向上转型,使得其引用指向实现类对象,实现多态性。
-
使用场景:
- 抽象类通常用于创建一些相似类的通用模板,其中可能包含一些共同的方法实现,同时又要求子类提供一些特定实现。
- 接口用于定义多个类共同遵守的规范,通过接口可以实现类与类之间的松耦合,使得代码更加灵活,方便扩展。
- 1) 如果想让一部分方法拥有默认实现,使用抽象类。
- 2) 如果想实现多重继承,必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
- 3) 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
【2】基本数据类型
| 基本类型 | 字节数 |
|---|---|
| byte | 1 |
| short | 2 |
| int | 4 |
| long | 8 |
| boolean | 1 true/false |
| char | 2 |
| float | 4 |
| double | 8 |
# 【3】list、set、map
-
List(列表):
- List是有序集合,可以包含重复的元素。
- List允许通过索引访问元素,并且可以根据索引插入、删除、替换元素。
- 常见的实现类有ArrayList、LinkedList和Vector。
-
Set(集合):
- Set是无序集合,不允许包含重复的元素。每个元素在Set中只能出现一次。
- 无序容器,无法保证每个元素的存储顺序,TreeSet通过Comparator或者Comparable维护了一个排序顺序。
- Set没有提供索引的方法,因为元素的位置是不确定的。
- 常见的实现类有HashSet、TreeSet和LinkedHashSet。
-
Map(映射):
- Map不是Collection的子接口或者实现类,Map和Collection同级,是一个接口。
- Map是键值对的集合,每个元素包含一个键(key)和一个值(value)。
- Map中的键是唯一的,每个键对应一个值,可以通过键来查找对应的值。
- 常见的实现类有1) HashMap、TreeMap、LinckedHashMap和HashTable。
- TreeMap也通过Comparator或者Comparable维护了一个排序顺序。
-
适用场景
- 1) 经常使用索引对元素进行访问,使用ArrayList,经常对元素进行增加删除操作,使用LinckedList
- 2) 想让元素按照插入的次序进行有序存储,使用List
- 3) 想要保证元素的唯一性,使用Set
- 4) 想要使用键值对的形式进行数据存储,使用Map