1、什么是类?
类是描述具有相同特性(数据元素)和行为(功能)的对象集合。
2、高内聚
每个对象都有它能提供的服务的内聚集合(通过对象去调用对应的行为)。
高内聚是软件设计的基本质量要求之一。
3、隐藏的必要
一个类的设计,需要对其数据的安全负责,可以理解为访问的控制权限。
访问控制存在的原因:
(1)让调用类的其他人,不能随便操作类的某些成员(保证数据的安全);以及避免让调用者掉入“坑”中,比如某些数据没有在类设计中没有初始化不能调用,否则异常。
(2)类库的设计者可以改变类的内部实现,而不会影响到调用者。
控制方式:访问控制符:public、protected、private以及默认
包访问权限
3、复用实现
一个类被设计完成后,其中的功能可以通过2种方式实现代码的复用。
(1)组合,就是将这个类当成另一个类的成员属性,通常是private。
组合是动态发生,就是称为聚合。(关于组合和聚合的区别可以参考网上资料)
(2)继承。
非常重要的说明:组合比继承更为灵活,因为我们可以动态的修改被组合的对象,同时可以组合多个,同时设计很清晰。
继承会导致类的设计变得复杂。
所以,优先考虑组合。
UML说明: 实心菱形表示组合关系,一条直线表示关联关系。
图1:组合示意图
4、 继承
继承表示了父类和子类的相似性。虽然继承创造了一个新的类型(子类),但是子类和父类是具有相同类型(如狗是动物)。子类是更加详细的父类。
子类和父类表现差异的方法2种:
(1)子类添加新方法。
关系:is-like-a(像一个)。父类是没法调用子类独有方法。
(2)子类覆盖父类的方法(改变父类行为)
关系:is-a(是一个)。可以通过父类引用指向子类对象,调用覆盖的方法。
UML说明:用空心三角形表示继承关系
图2:继承示意图
5、多态
伴随多态的可互换对象。
处理类型的结构层次关系的时候,经常性的希望将一个对象不是作为它本身类型处理,而是当成它的父类进行处理。
实现的是通过父类引用实现处理不同消息。
实现方法:A a = new B(); //这里涉及到向上转型
a.method();
子类要重写了父类的方法。不同的子类响应的消息不同。
6、单继承
单继承保证对象的类型是唯一确定的。如铅笔是笔,不会是动物。
7、容器
(1)不同容器的效率不同,java提供了很多种类型的集合基于不同数据结构类型实现的。
说明:LinkedList和ArrayList的区别
linkedList是基于链表实现的,ArrayList是基于数组实现的
所以: linkedList查找元素慢,插入和删除元素快;ArrayList相反。
(2)参数化类型(泛型)
容器存放的是Object,从存入对象(任意类型),都会向上转化为Object类型,取出对象,需要程序员自己强制向下转型。
这个过程缺陷明显:1)向下转型不安全,极容易报运行时异常(类型转换错误);
2)向下转型和运行时的检查都需要花费运行代码的大量时间;
泛型保证存入对象类型一致,编译器进行检查很好。
8、对象的创建和生命期
java中对象的创建通过new,在堆(heap)的内存池中动态的创建对象。通过垃圾回收机制自动回收不需要的对象垃圾(不再需要使用的对象)。
说明:c++所以高效,是将对象创建在堆栈上了。
面试经常问:java的垃圾回收机制?
9、 并发编程
并发:同一时刻处理多个任务。
并发的问题:共享资源处理。
正确的方式:某个任务锁定某项资源,完成任务后,释放资源锁,使其他任务可以使用这项资源。
面试经常问:进程与线程的区别?
10、OOP
OOP面向对象编程,说白了就是如何设计类,基于类的编程。
有人解释:OOP:引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。
AOP:为多个分散的类引入公共行为