Java编程思想第三更
为什么拖更
- 最近的需求基本都搞完了,也是看起来很简单的东西搞了快一个月,确实学到了很多东西,还是上手操作学的更快啊,有机会的话会写一下其中遇到的坑和学到的东西(挖坑+1)。
- 因为以后不太可能每个星期都更新了,所有这个系列就不叫每周了,当然我会尽量更新一下内容的。
- 这两天会写一篇我在Windows下常用的软件,也算是给自己做个备忘录(挖坑+2)。
1.6.2 抽象的基础类和接口
设计程序时,我们经常都希望基础类只为自己的衍生类提供一个接口。也就是说,我们不想其他任何人实际创建基础类的一个对象,只对上溯造型成它,以便使用它们的接口。为达到这个目的,需要把那个类变成“抽象”的——使用abstract 关键字。若有人试图创建抽象类的一个对象,编译器就会阻止他们。这种工具可有效强制实行一种特殊的设计。
- 如果希望一个类只是用来提供接口,并且不能实例化,那么使用abstract关键字,编译器会阻止实例化 的行为。
亦可用abstract 关键字描述一个尚未实现的方法——作为一个“根”使用,指出:“这是适用于从这个类继承的所有类型的一个接口函数,但目前尚没有对它进行任何形式的实现。”抽象方法也许只能在一个抽象类里创建。继承了一个类后,那个方法就必须实现,否则继承的类也会变成“抽象”类。通过创建一个抽象方法,我们可以将一个方法置入接口中,不必再为那个方法提供可能毫无意义的主体代码。interface(接口)关键字将抽象类的概念更延伸了一步,它完全禁止了所有的函数定义。“接口”是一种相当有效和常用的工具。另外如果自己愿意,亦可将多个接口都合并到一起(不能从多个普通class 或abstract class 中继承)。
- 如果一个方法没有任何的实现,可以定义为抽象方法,子类在继承的时候必须实现,否则子类也必须是抽象类。
- interface将抽象类的概念进一步提取,感觉是更纯粹的抽象类,在接口中所有的方法都必须是抽象的,而抽象类不一定其中都是抽象方法。并且一个类是可以多继承接口的,但是只能单继承类。这在一些方面弥补了Java单继承带来的问题。
1.7 对象的创建和存在时间
OOP(面向对象程序设计)只是涉及抽象的数据类型、继承以及多形性,但另一些问题也可能
显得非常重要。最重要的问题之一是对象的创建及破坏方式。对象需要的数据位于哪儿,如何控制对象的“存在时间”呢?
C++认为程序的执行效率是最重要的一个问题,所以它允许程序员作出选择。为获得最快的运行速度,存储以及存在时间可在编写程序时决定,只需将对象放置在堆栈(有时也叫作自动或定域变量)或者静态存储区域即可。这样便为存储空间的分配和释放提供了一个优先级。某些情况下,这种优先级的控制是非常有价值的。然而,我们同时也牺牲了灵活性,因为在编写程序时,必须知道对象的准确的数量、存在时间、以及类型。
- 在c++中,对象的创建使用销毁都是程序员自行处理,这里对空间的占用的控制非常自由,但是在编码的时候就非常需要注意对象是否存在等。
第二个方法是在一个内存池中动态创建对象,该内存池亦叫“堆”或者“内存堆”。若采用这种方式,除非进入运行期,否则根本不知道到底需要多少个对象,也不知道它们的存在时间有多长,以及准确的类型是什么。
这些参数都在程序正式运行时才决定的。若需一个新对象,只需在需要它的时候在内存堆里简单地创建它即可。由于存储空间的管理是运行期间动态进行的,所以在内存堆里分配存储空间的时间比在堆栈里创建的时间长得多(在堆栈里创建存储空间一般只需要一个简单的指令,将堆栈指针向下或向下移动即可)。
由于动态创建方法使对象本来就倾向于复杂,所以查找存储空间以及释放它所需的额外开销不会为对象的创建造成明显的影响。除此以外,更大的灵活性对于常规编程问题的解决是至关重要的。
- 看不懂,大概意思是说对象都是存储在内存中的,而需要使用何种对象只有在运行时才能确定。当需要一个新对象是再在内存中创建。
- 操作内存比操作堆栈慢许多(ps:数组好像就是存储在堆栈中使用的,切换数据只要移动一次指针就可以,所以效率非常高)。
C++允许我们决定是在写程序时创建对象,还是在运行期间创建,这种控制方法更加灵活。
大家或许认为既然它如此灵活,那么无论如何都应在内存堆里创建对象,而不是在堆栈中创建。但还要考虑另外一个问题,亦即对象的“存在时间”或者“生存时间”(Lifetime)。若在堆栈或者静态存储空间里创建一个对象,编译器会判断对象的持续时间有多长,到时会自动“破坏”或者“清除”它。
程序员可用两种方法来破坏一个对象:用程序化的方式决定何时破坏对象,或者利用由运行环境提供的一种“垃圾收集器”特性,自动寻找那些不再使用的对象,并将其清除。
当然,垃圾收集器显得方便得多,但要求所有应用程序都必须容忍垃圾收集器的存在,并能默许随垃圾收集带来的额外开销。但这并不符合C++语言的设计宗旨,所以未能包括到 C++里。
- 清理对象的两种方式,手动挡和自动档。显示的代码清理,隐式的GC清理。
Java编程思想第三更