面向对象--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第四版
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第四版
相关文章推荐
- Java编程学习笔记-2.面向对象-[2-1]面向对象思想
- [学习笔记]Java面向对象思想和内存模型
- 黑马程序员--Java学习笔记之面向对象思想(单例模式详解、匿名对象、静态、final)
- 黑马程序员--Java学习笔记之面向对象思想(多态、内部类、匿名内部类、异常类)
- 传智播客_张孝祥_Java基础3_面向对象上_学习笔记
- 学习笔记6—Java基础4_面向对象下b
- java语言面向对象笔记,在学习面向对象时应该理解掌握的原理-作者:逝秋
- java学习笔记《java面向对象编程》——面向对象开发方法概述
- Java菜鸟学习笔记--面向对象篇(十八):对象转型&多态
- (JAVA SE 学习笔记)Java.SE.第011讲.面向对象之封装.续二(对一些原理机制进行了详细的解释,适合初学者学习)
- 黑马程序员_java面向对象学习笔记
- UML学习笔记(三):运用面向对象思想
- 【JAVA学习笔记】面向对象基础
- JAVA学习笔记(二)-面向对象程序设计
- Java的“对象思想”学习笔记[二]
- java面向对象思想学习整理
- 学习笔记4—Java基础3_面向对象上b
- UML学习笔记(三):运用面向对象思想
- Java菜鸟学习笔记--面向对象篇(十六):Object类方法
- Java菜鸟学习笔记--面向对象篇(二):封装与访问修饰符