一、面向对象
什么是面向过程
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了(百度百科)。
C语言是典型的面向过程的编程语言。在C语言中,你就是上帝(主函数就是上帝意志的体现…),你把想做的事“封装”成一个一个函数模块,然后在主函数中通过调用不同的函数完成不同的功能,最后达到你想到的效果(得到你想要的输出)。
如:定义一个 Student 结构体,然后定义一个study函数。在主函数中调用study函数,打印“XXX is studying ! ”语句。
有人说,面向对象就是结构体里面包含了函数,好像对也好像不对:面向对象编程确实把数据(属性)和函数(方法)放到了一块,但是它还有许许多多面向过程编程没有的特性。
什么是面向对象
面向对象就是是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(百度百科)。
JAVA是典型的面向对象编程语言之一。在JAVA(或者说面向对象编程语言)中,你还是上帝,但是你是一个“简政放权”了的上帝。你创建了一个个对象,然后这些对象干这干那的。
如:创建一个Student对象,然后这个Student对象在主函数中调用自己study函数,打印“XXX is studying ! ”语句。
主函数还是上帝,但是study行为不是上帝发出的了,Student也不用被当做原材料了,study这个行为是Student主动发出的。
面向对象的特性
封装
对象把自己的数据(属性)隐藏起来,外部无论是访问还是赋值,都必须按照类自己定义规范来。
如,你可以在setter中,规范age的范围:
继承
当一个class(类),和一个已经定义好的class有“is-a”关系(如猫 Cat 是动物 Animal,Cat is Animal),那么 Cat 就可以继承 Animal。Animal 中的属性,Cat就可以使用了(达到了代码复用的效果)。
多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
以下是一个多态实例的演示,详细说明请看注释:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
a.work();
// 类型判断
if (a instanceof Cat) {
// 猫做的事情
Cat c = (Cat)a;
c.work();
c.eatFish();
} else if (a instanceof Dog) {
// 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
abstract void work();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
public void eatFish(){
System.out.println("吃鱼");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
接口
官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
-
接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。
-
一个接口就是描述一种能力,比如“运动员”也可以作为一个接口,并且任何实现“运动员”接口的类都必须有能力实现奔跑这个动作(或者implement move()方法),所以接口的作用就是告诉类,你要实现我这种接口代表的功能,你就必须实现某些方法,我才能承认你确实拥有该接口代表的某种能力。
-
一个JAVA库中接口的例子是:Comparator 接口,这个接口代表了“能够进行比较”这种能力,任何类只要实现了这个Comparator接口的话,这个类也具备了“比较”这种能力,那么就可以用来进行排序操作了。
为什么要用接口
- 接口被用来描述一种抽象。
- 因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限。
- 接口也被用来实现解耦。
接口和抽象类的区别:
1.接口可以多继承,抽象类不能实现多继承。
2.接口只能定义抽象规则,抽象类既能定义抽象规则也可以提供已经实现的成员。
3.接口只包含方法,属性,索引器,事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性,字段,包含有实现的方法。
4.抽象类应主要用于关系密切的对象,而接口则是适合为不相关的类提供通用功能。
5.接口着重于Can——Do关系类型,抽象类则偏重于IS——A式关系
6.接口多定义对象的行为,抽象类多定义对象的属性
二、集合
- List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
- Set下有HashSet,LinkedHashSet,TreeSet
- List下有ArrayList,Vector,LinkedList
- Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
- Collection接口下还有个Queue接口,有PriorityQueue类
![](https://img-blog.csdn.net/20180612094225630?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5ncXVuc2h1YWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70
Connection接口:
List 有序,可重复
ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
Set 无序,唯一
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
基于HashMap实现
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
基于LinkedHashMap实现
TreeSet
底层数据结构是红黑树。(唯一,有序)
- 如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
TreeSet的应用,自定义排序规则
public class MyClass {
public static void main(String[] args) {
TreeSet<Student> ts