您的位置:首页 > 编程语言 > Java开发

面向对象--java学习(java编程思想)笔记

2014-09-16 00:53 459 查看
1、面向对象程序设计的挑战之一,就是在问题空间的元素和解空间的对象之间创建一对一的映射。

2、访问控制:public、private、protected、default

public:对任何人都可见

private:除类型创建着和类型的内部方法之外的任何人都不能访问

protected:与private作用相当,差别仅在于继承的类可以访问protected成员,但不能访问protected成员

default:包访问权限,类可以访问在同一个包中的其它类的成员,但在包之外,这些成员如同指定了private一样。

3、基类与导出类的两种关系:

是与像的两种关系:

是关系:继承只覆盖基类的方法,导出类和基类是完全相同的类型。(纯粹替换)

像关系:在导出类型中添加新的接口元素。基类无法访问新添加的方法。

4、多态

问题:当导出类的对象向上转型成为基类的对象的时候,该转型的基类对象在调用方法的时候,是如何知道该调用哪个导出类中的方法的?

在非面向对象编程中函数调用采用的是前期绑定。面向对象采用后期绑(具体实现还不太清楚)来解决这个问题。

注:在某些语言中,必须明确地声明希望某个方法具备后期绑定属性所带来的灵活性(c++是使用virtual关键字来实现的--即虚函数)。在这些语言中,方法在默认 情况下不是动态绑定的。而在java中,动态绑定是默认行为,不需要额外的关键字来实现多态。

5、单根继承结构:所以的类最终都继承自单一的基类---Object类(java中)

c++所提供的继承结构非单根继承,是无法确保所以的对象都同属于同一个基本类型。这么做能够更好的适应c模型,而且受限较少,但是当要进行全面的面向对象程序设计时,则必须构建自己的继承体系。并且在c++在获得任何新类库中,总会用到一些不兼容的接口,需要花力气(有可能需要通过多重继承)来使新接口融入设计中。 所以哪种方式更好,如果在c上面投资巨大,那么c++的向前兼容性的设计则是值得的。

6、参数化类型--泛型

文中描述了这样一个问题:容器作为存储对象的集合,用Object来存储的容器可以存储任何的对象,使得该容器更容易被复用。但在将对象放入容器内,对象必须被转型成为Object,因此它为丢失其身份,当把它取回时就获取了一个对Object对象的引用,而不是对置入时的那个类型的对象的引用。

向下转型在转型类型为错误的情况下是危险的。大多数情况下需要程序员自己来指定这种向下转型的类型,并且向下转型和运行时的检查需要额外的程序运行时间。

参数化类型就很好的解决了上述问题。但为什么在java中,例如Android中,获取组件的资源过程中,还是采用了向下转型的机制,而没有使用泛型的原因?

7、对象的创建和生命周期

方式一:为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈(它们有时被称为自动变量或限域变量(scoped variable)------不懂)或静态存储区域内来实现。

方式二:在被称为堆的内存池中动态地创建对象。这种方式,直到运行时才知道需要多少对象,它们的生命周期如何以及具体类型是什么。因为存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间,这可能原因大于在堆栈中创建存储空间的时间。(在堆栈中创建存储空间和释放存储空间通常只需要一条汇编指令,分别对象将栈顶的指针向下移动和将栈顶的指针向上移动。)而创建堆存储空间的时间依赖于存储机制的设计。

如何选择:动态方式有这样一个一般性的逻辑假设:对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大的冲击。(java完全采用了动态分内存分配方式)

如果在堆上创建对象,编译器对改对象的生命周期一无所知,在c++中必须以编程的方式来决定何时销毁对象,这可能因为不正确的处理导致内存泄漏。(c++大部分内存泄漏的根源原来在这~)。java则才用了“垃圾回收机制”,---垃圾回收器”知道“对象何时不再被使用, 并自动释放对象占用的内存。这一点通所以对象都继承自同一个单根类Object以及只能以一种方式创建对象(在堆上创建)这两个特性结合起来。---这三者到底有什么关系,垃圾回收器是如何“知道”对象何时不再被使用的,以后的学习中多加留意。

向作者致敬:几乎所有摘录自《java编程思想》--Thinking in java第四版
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: