Java Road
Part1
Java的设计思想(OOP面向对象编程)百度一下
1.OOP特性
- 万物皆为对象
- 程序是对象的集合,他们通过发送消息来告诉彼此要想做的
- 每个对象都有自己的有其他对象构成的存储
- 每个对象都有其类型(每个对象都是某个类的一个实例instance)
- 某一特定类型ed所有对象都能接受同样的消息
2.接口与对象
通常在描述类时使用UML(Unified Modelling Language)图来进行表示,上部代表了类名,中部可以是数据成员,底部通常为方法(一般只写公共的方法)
接口确定对某一对象所能发出的请求,你需要做的事情就是:
- 创建Light类
- 定义这个对象的引用
- 向对象发送消息
Light It=new Light();
It.on();
3.设计中的边缘控制(针对于客户端程序员与类库创建者)
- 让客户端程序员无法触及他们不应该触及的地方
- 让类库程序员可以改变类内部的工作方式而不影响到客户端程序员
边界设定的标识符:
(1)protect:类型额创建者和类型内部创建的方法以及继承的类可以访问
(2)private:类型额创建者和类型内部创建的方法之外的不能访问
(3)public:对任何人可用
(4)默认访问权限:当不使用前面三种标识符时,即可发挥作用。该权限被称为 包访问权限,可以访问在一个包中的其它类成员,但是在包之外,如同private一样,不可被访问
4.伴随多态的可互换对象
- 泛化操作
- 编译器不能产生传统意义上的函数调用。在非面向对象程序设计中,函数的调用会产生前期绑定,即产生一个对具体函数的调用,运行时将调用解析到要被执行的代码的绝对地址。由此,在OOP中,直到运行时才知道代码的地址。OOP中采用的是后期绑定,为了达到后期绑定,Java中引入一段代码来取代绝对地址的调用,这段代码是用储存在对象中的信息来确定方法体的地址。C++若要使用后期绑定的灵活性需要用到virtual关键字;而在Java中,动态绑定是默认,可直接使用多态。
void dosomething(Shape shape){
shape.erase();
//...
shape.draw();
//...
}
Circle circle=new Circle();
Triangle trianle=new Triangle();
Line line new Line();
dosomthing(circle);
dosomthing(triangle);
dosomthing(line);
dosomething()可以传达给Shape任何消息,它的子类也能接受到,这是因为向上转型(upcasting)
5.单根继承结构
Java中所有的类都继承自Object这个终极基类,因此,Java可以方便的实现垃圾回收机制:所有的对象都保证其有类型信息,不会因此陷入僵局。
6.可以引用多个对象的对象类型-容器
一、不同容器提供了不同的接口与外部行为;
二、不同容器对于某些操作具有不同的效率;
7.参数化类型
可以储存Object类型的容器可以储存任何东西。要使用这类容器,要在其中置入对象的引用。由于Java中采用的单根继承,在置入这些对象的引用时,这些对象丢失其身份,都将转化为Object对象的引用。当取回时,就是取回这些Object对象的引用。
如果要将Object引用转化为原先的身份,需要使用到向下转型,向上转型是安全的,向下转型是不安全的
- 向下转型并不是彻底危险的,如若向下转型为错误类型,会有异常提醒
- 为了解决向下转型的问题,使用参数化类型机制,它是一个编译器可以自动定制作用于特定类型上的类
- 向下转型和运行时的检查需要耗费额外的时间
- 表示方法为一对尖括号,括号中是类型信息
ArrayList<Shape> shapes=new ArrayList<Shape>();
8.控制对象的生命周期
- C++采用效率控制,给予程序员选择的权利:对象的存储空间和生命周期在编写程序时确定,将对象置于堆栈(自动变量区或限域变量)、静态存储区域
- 在堆(heap)的内存池中动态的创建对象。Java完全采用了动态内存分配方式,在创建新对象的动态实例时,需要用到new关键字。采用堆时,不知道对象的生命周期,使用C++语言时可能会产生内存泄漏,Java提供了”垃圾回收器”机制,知道对象何时不会被使用,并自动释放对象所占用的内存。
(哦,我亲爱的秃头兄弟,今天你有好好使用洗发水了么)