一、对象导论
1、访问控制权限
通过访问控制将具体的实现隐藏起来,服务享用者不必关心服务如何实现,只需关注具体的业务即可。而且服务的修改完善对于服务的使用者来说是完全透明的,服务享用这不用去修改自己的代码。
| 修饰词 | 作用 |
|---|---|
| public | 任何类都可以访问 |
| default | 同一个包下可以访问 |
| protected | 子类可以访问 |
| private | 只有当前类可以访问 |
2、复用
面对对象提供了复用的概念。
组合:has-a,拥有的关系。
继承:is-like-a,是一个的关系
继承是编译时刻静态定义的,属于静态复用。
组合用于复杂的设计,他们之间的关系是在运行的是候才能确定的。即在运行前对象没有创建,整体类不会知道自己持有特定接口下的那个实现类,因此,在扩展方面组合比继承更加具有广泛性。同时也能使每个类更专注于自身的功能,但组合的使用会使得在程序运行的过程中创建许多对象。
子类继承父类后,父类的所有属性和方法都可以被子类访问和调用,并且子类可以根据自己的需求重写父类方法的实现细节,也就是说,父类方法的实现细节对子类是可见的,所以继承又被称为“白盒复用“。而将部分类组合使用成整体类时,只要求建立一个好的接口,整体类和部分类之间不会关心各自的实现细节,所以被称为“黑盒复用”。因为子类能拥有和改写父类中的属性和方法,所以组合在封装性上要优于继承。同时,由于继承中子类和父类的耦合度较高,使子类缺乏一定的独立性,并在父类代码进行修改时,子类也不得不进行相应的修改,增加了维护的难度。
3、后期绑定
我认为面向对象和面向过程很大的区别就是前期绑定和后期绑定的概念。并且后期绑定的概念使的Java拥有的通过向上转型而得到了多态的特征。
前期绑定:前期绑定是面向过程的一种特性,在编译期间,编译器将会对一个具体的函数名的调用,在运行时将这个调用解析为实际地址。
后期绑定:编译器在编译期间不对具体的函数发生调用,Java使用一段特殊的代码来替代绝对地址的使用,这段代码用来计算方法体的具体地址。在编译期间,编译器会确保方法的存在,并对方法的参数和返回值进行执行类型检测,但并不知道方法执行的确定地址。程序直到运行时才能直到方法的确切地址。
个人认为这个后期绑定是实现多态的一个重要点,并且也是面向对象和面向过程的重大区别。
4、Java单继承
Java是单继承的,所有的类度归属于Object类。
单继承保证了所有的类都具备某些特定的功能,例如toString,equals。
4.Java单继承的优点: 相比于C++的多继承,Java只支持类的单继承,Java中的所有类的共同基类是 Object类,Object类是Java类树的唯一根节点,这种单继承有以下好处: (1).单继承可以确保所有的对象拥有某种共同的特性,这样JVM虚拟机对所有的类进行系统级的操作将提供方便,所有的Java对象可以方便地在内存堆栈中创建,传递参数也变的更加方便简单。 (2).java的单继承使得实现垃圾回收器功能更加容易,因为可以确保JVM知道所有对象的类型信息。
5、参数类型化
Java中向上转型是安全的(虽然会丢失子类的身份)。
Java中向下转型是不安全的,除非知道对象的真实身份。
在JavaSE5中之前,容器存储的对象只有Java的通用对象类型Object,当往容器中放入元素的时候就会发生向上转型,虽然这是安全的,但是这会使得丢失容器中元素的真正身份。但当我们从容器中取元素的时候,就会发生向下转型,除非我们可以确切的知道容器中存储元素的真正身份,否则向下转型是不安全的,会发生类型转换异常。
这个问题的真正原因是因为我们不能真正的知道容器中存储的元素是啥,那么为啥不创建一个能知道自己保存对象类型的容器不就可以解决这个问题吗,因此泛型就出现了。
泛型的出现就是为了解决向下转型的时候我们不知道元素真正的的类型。并且向下转型和运行时类型检测都会消耗时间。
泛型解决了容器存储和查取数据类型的一致性。
6、对象的声明周期
Java使用完全动态内存分配方式,每当想创建对象的时候,就需要使用new关键词来创建对象的动态实例。
7、多线程
并发编程的隐患:共享资源。