|
我对java的理解 在我看来,java程序是对象的集合,是一系列带有方法的对象组合,这些方法以其他对象为参数,并发送消息给其他对象。 这样由于java中的对象是由状态、行为和标识组成。状态可以认为是对象存在的具体值;行为可认为是对象所能做的操作;而标识是对象在内存中的唯一地址。通常在程序中只能看到对象的前两个属性。 在java中所有的代码都必须写在class里,而每个对象都是某个类(class)的一个实例(instance),也就是说java中的所有操作都是由对象完成的。 在解决实际问题中,我们可以抽取待求解问题的任何概念化构件(即模块),把他表示成程序中的对象。而我们抽取的模块的类型和质量直接决定我们所能解决问题的复杂程度。 例如:我们在计算一个比较大的矩阵的全排列求值问题。这个问题可以分成两个模块。第一、矩 阵的全排列;第二、对每种排列进行运算。对于我们来说,第一步是相对容易的,我们只需要一个公式。而对于每种排列的计算对于我们来说确是比较困难的。计算机语言正与我们相反,任何值的运算,在正常情况下只要有相应的算法,计算机就能将值运算的正确。而将矩阵全排列对计算机来说是个相对复杂的一件事,因为它不懂得数学公式,计算机只能靠顺序、条件、循环指令来完成所要做的事,这样第一模块的算法是计算机求解这个问题的关键。 所以在对实际问题进行解决时,对模块的划分应该基于计算机的结构,而不是基于所要解决问题的结构。这一点我认为很重要,因为这样有利于我们对问题的求解。 程序员所要做的是在“问题空间”和“解空间”之间建立模型,然后实现算法。所以对模块的划分十分重要。 在java中提供了class 和 interface。 接口(interface)定义了对某个特定对象所能发出的请求,即我们能够“做什么”,而接口不会提供“应该怎么做”。 “应该怎么做”是由类(class)提供的,在类中会对“如何去做”有详细的方法。在编写程序时应该尽量少用类的继承,而是多用组合。 例如:有两个类 class A 和 class B,如果B想使用A中的方法,应该多以下面形式完成: class B{ A a = new A( ); //调用类A中的方法; } 这种方式就叫做“组合”。而不是以下面的形式完成: class B extend A{ //直接继承类A的方法或重新定义类A的方法; } 如果在B中声明A的实例(即对象)不能满足程序的要求,则优先考虑使用与A有同样功能的接口, 最后在必要的时候才使用继承。因为java中不支持多继承,所以拥有父类的类就不能再继承其他的类,这样不利于程序扩展和维护,而一个类的接口是没有限制的。
所以在java中应该首先考虑组合,其次是实现能够完成功能的接口,然后才考虑继承能够完成功能的类。 最后简单说说我的编程方法,软件工程的整个顺序大家都知道,软件生命周期的阶段划分有很多种,但大致相同,我所知道的比较细化的由: 1. 问题描述(需求分析); 2. 设计(概要与详细设计); 3. 风险分析; 4. 验证; 5. 编码; 6. 测试; 7. 完善; 8. 生产; 9. 维护; 九个阶段组成,不管分为多少阶段,应该注意的是:各阶段不是线性的,而是循环的,生命周期的起点当然是问题描述,但在开发的过程中从一个阶段可能跳到任意一个阶段。而向前的跳转是因为在其前面的阶段设计不够完善,或者后期需要增加的扩展所产生的影响。文字 我现在只说说在准备编写代码之前要做的一些具体的细节: 1.在编写程序之前一定要建立一个对求解问题的模型,应该充分考虑程序需要哪些功能,这样比在程序编写的后期添加一个变量或方法要容易得多。 2.模型建立之后,应该将其分成若干个模块(可以是一个类或多个类,也可以仅仅是一个方法,因为总有些方法在实现时是很困难的),模块在上文已经说了其重要性,总之想将待解决问题一次性整体解决是一件很困难的事。 3.对每个模块需要多少个类,分别完成什么功能应该有初步的定义,最好能有个相对应的文档。 4.要首先考虑类的入口(参数)和出口(返回值),而不要考虑类的实现,这样有利于对象之间相互传递信息。 5.最后是每个类的实现,在实现过程中因为已经定义好了类的入口和出口,所以每个类都是完全独立的。这样,即使我们有的模块划分的过大,也可以将其拆分为多个更小的模块,而不会影响到程序的其他模块,因为其他的模块只需要考虑原来的较大的模块的入口和出口。当然我觉得应该尽量在程序开发初期尽量是模块分配的完善和容易实现。
以上就是我对java的一点看法,和对java编程的一点心得,希望能对大家有所帮助。
|
一共有 2 条评论