Day-01 面向对象的一些东西
在看了一些相关的基础视频后,还是回来看书了,接下来会边写笔记边看书,这样就可以自己及时来复习了.然后看的书是<< On Java 8 >>,链接如下:On Java 8
Alan Kay 总结的面向对象的五大基本特征:
- 万物皆对象.你可以将对象想象成一种特殊的变量.它存储数据,但可以在你对其“发出请求”时执行本身的操作.理论上讲,你总是可以从要解决的问题身上抽象出概念性的组件,然后在程序中将其表示为一个对象.
- 程序是一组对象,通过消息传递来告知彼此该做什么.要请求调用一个对象的方法,你需要向该对象发送消息.
- 每个对象都有自己的存储空间,可容纳其他对象.或者说,通过封装现有对象,可制作出新型对象.所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度.
- 每个对象都有一种类型.根据语法,每个对象都是某个“类”的一个“实例”.其中,“类”(Class)是“类型”(Type)的同义词.一个类最重要的特征就是“能将什么消息发给它?”.
- 同一类所有对象都能接收相同的消息.这实际是别有含义的一种说法,大家不久便能理解.由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收发送给"形状”的消息.这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”.这一特性称为对象的“可替换性”,是OOP最重要的概念之一.
Grady Booch 提供了对对象更简洁的描述:
一个对象具有自己的状态,行为和标识.这意味着对象有自己的内部数据(提供状态)、方法 (产生行为),并彼此区分(每个对象在内存中都有唯一的地址).
单继承
Java中使用单继承结构,所有的对象都默认从一个基类继承,这个基类为Object
.且单继承的结构使得垃圾收集器的实现更为容易.
集合
集合类似与C++的STL,里面有很多常用的容器,比如List, Map, Set等.
选择集合的原因:
- 集合可以提供不同类型的接口和外部行为.堆栈、队列的应用场景和集合、列表不同,它们中的一种提供的解决方案可能比其他灵活得多.
- 不同的集合对某些操作有不同的效率.例如,List 的两种基本类型:ArrayList 和 LinkedList.虽然两者具有相同接口和外部行为,但是在某些操作中它们的效率差别很大.在 ArrayList 中随机查找元素是很高效的,而 LinkedList 随机查找效率低下.反之,在 LinkedList 中插入元素的效率要比在 ArrayList 中高.由于底层数据结构的不同,每种集合类型在执行相同的操作时会表现出效率上的差异.
向上转型和向下转型
向上转型:失去原有的类型特性,当作父类,或者更久远的类去使用.
向下转型:把当前是一个父类的类当作自己的继承类去使用,需要强制转换(错误的转换可能出现异常).
泛型
泛型就是参数化类型机制,参数化类型机制可以使得编译器能够自动识别某个 class
的具体类型并正确地执行.
对象的创建与生命周期
在C++中,通常由系统分配的对象在栈中,且由栈释放,而由程序员自己new
出来的对象,分配在堆中,需要有程序员手动释放,如果在不需要时,仍然未释放,则会造成内存泄漏.
而在Java中使用动态内存分配,同样使用new
关键字来分配.Java 的内存管理是建立在垃圾收集器上的,它能自动发现对象不再被使用并释放内存.垃圾收集器的存在带来了极大的便利,它减少了我们之前必须要跟踪的问题和编写相关代码的数量.因此,垃圾收集器提供了更高级别的保险,以防止潜在的内存泄漏问题,这个问题使得许多 C++ 项目没落.