Java面向对象的思维方法

我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭,因为我早以习惯用C来编写程序,很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。

我对Java的面向对象的特性琢磨良久,自认为有所领悟,也开始有意识的运用OOP风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。

举个例子,要发广告邮件,广告邮件列表存在数据库里面。倘若用C来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail的sendmail命令发送。

然后考虑用Java来实现,既然是OOP,就不能什么代码都塞到main过程里面,于是就设计了三个类:

一个类是负责读取数据库,取邮件地址,调用qmail的sendmail命令发送;

一个类是读邮件内容,MIME编码成HTML格式的,再加上邮件头;

一个主类负责从命令读参数,处理命令行参数,调用发email的类。

把一件工作按照功能划分为3个模块分别处理,每个类完成一件模块任务。

仔细的分析一下,就会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。

这样的分析方法其实是不适用于Java这样面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java实现起来轻松的多,逻辑上也清楚的多。

我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。

举一个非常简单的例子:假使现在需要写一个网页计数器,客户访问一次页面,网页计数器加1,计数器是这样来访问的http://hostname/count.cgi?id=xxx

后台有一个数据库表,保存每个id(一个id对应一个被统计访问次数的页面)的计数器当前值,请求页面一次,对应id的计数器的字段加1(这里我们忽略并发更新数据库表,出现的表锁定的问题)。

如果按照一般从程序实现的角度来分析,我们会这样考虑:首先是从HTTP GET请求取到id,然后按照id查数据库表,获得某id对应的访问计数值,然后加1,更新数据库,最后向页面显示访问计数。

现在假设一个没有程序设计经验的人,他会怎样来思考这个问题的呢?他会提出什么样的需求呢?他很可能会这样想:

我需要有一个计数器,这个计数器应该有这样的功能,刷新一次页面,访问量就会加1,另外最好还有一个计数器清0的功能,当然计数器如果有一个可以设为任意值的功能的话,我就可以作弊了。

做为一个没有程序设计经验的人来说,他完全不会想到对数据库应该如何操作,对于HTTP变量该如何传递,他考虑问题的角度就是我有什么需求,我的业务逻辑是什么,软件应该有什么功能。

按照这样的思路(请注意,他的思路其实就是我们平时在生活中习惯的思维方式),我们知道需要有一个计数器类 Counter,有一个必须的和两个可选的方法:

getCount()
// 取计数器值方法
resetCounter()
// 计数器清0方法
setCount()
// 设计数器为相应的值方法
把Counter类完整的定义如下:
public class Counter
{
public int getCount(int id)
{
}
public void resetCounter(int id)
{
}
public void setCount
(int id, int currentCount)
{
}
}

时间: 2024-05-11 01:52:46

Java面向对象的思维方法的相关文章

详解Java面向对象编程中方法的使用_java

一个 Java 方法是为了执行某个操作的一些语句的组合.举个例子来说,当你调用 System.out.println 方法时,系统实际上会执行很多语句才能在控制台上输出信息. 现在你将学习怎么创建你自己的方法,他们可以有返回值也可以没有返回值,可以有参数,也可以没有参数,重载方法要使用相同的方法名称,并在程序设计中利用抽象的方法. 创建方法我们用下面的例子来解释方法的语法: public static int funcName(int a, int b) { // body } 在这里 publ

【Java面向对象学习】一张图搞定Java面向对象

刚开始学习Java的时候,一个人跌跌撞撞摸索着往前走,很多东西理解的也懵懵懂懂,后来实践的多了,才慢慢清楚:许多东西虽然很基础但是却很重要,是需要反复思考和加深理解的,[Java面向对象学习]一张图搞定Java面向对象,分享一些归纳总结后的技术干货,一张图能搞定的事,绝对不长篇大论. 大家都知道,Java面向对象是Java的一个核心,也是初学者的一个难点,所以我们从这里开始,Let's go ! Java面向对象 面向对象(Oriented Object) 是相对于面向过程而言的,过程其实就是函

java 面向对象面试集锦_java

java  面向对象:这里整理了面向对象的基础知识,帮助大家学习理解,希望能帮助到大家,这里是 根据公司面试资料整理的相关知识: Overload和Override的区别.Overloaded的方法是否可以改变返回值的类型? Overload是重载的意思,Override是覆盖的意思,也就是重写.重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子

JavaScript面向对象分层思维全面解析_javascript技巧

js本身不是面向对象语言,在我们实际开发中其实很少用到面向对象思想,以前一直以为当要复用的时候才封装成对象,然而随着现在做的项目都后期测试阶段发现面向对象的作用不仅仅只是复用,可能你们会说面向对象还有继承,多态的概念,但在javascript里面多态的概念是不存在,而继承由于web页面的必须先下载js在运行导致js的继承不能像后台那么灵活而且js没有重载以及重写不方便(而且js中重写的意义不是很大),所以在js中很少用到面向对象,可能在一些插件中会看到对象的写法,写js的都会有同样的感觉在写一个

Java 库的建立方法及其实例

作者 ariesram 电子邮件地址 ariesram@linuxaid.com.cn, 或 ariesram@may10.ca 本文及本人所有文章均收集在bambi.may10.ca/~ariesram/articles/中. 本文授权给www.linuxaid.com.cn. 正文: 任何一种面向对象语言都有它的库.任何一种面向对象的语言也都离不开库的支持.用我们熟悉的 面向对象语言为例子,C++有STL,Java有API函数,具体到开发工具,Visual C++提供了MFC, Borlan

如何在Java中避免equals方法的隐藏陷阱

译者注 :你可能会觉得Java很简单,Object的equals实现也会非常简单,但是事实并不是你想象的这样,耐心的读完本文,你会发现你对Java了解的是如此的少.如果这篇文章是一份Java程序员的入职笔试,那么不知道有多少人会掉落到这样的陷阱中. 摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继承类作为面向对象语言中的等价关系的基础问题,要保证派生类的e

JAVA学习(五):Java面向对象编程基础

Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它采用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目的. 1.OOP的3个特性(封装.继承和多态性) 封装是类的基础,指把类的相关实现细节隐藏起来,在类中将数据和实现操作的代码集中起来放在对象的内部,调用这些类时只需直接使用类预留的接口就可以了. 继承提供了子类自动拥有父类数据结构和方法的机制,它表示类之间的一种关系. 多态指使一个对象被看成另一个对

JAVA面向对象之对象和类

Java是一种面向对象的编程语言,面向对象在整个Java的学习中属于重中之重,从这一篇博客开始,将逐步为大家介绍Java面向对象的相关知识,这一偏将为大家介绍对象和类的概念以及如何定义类和创建对象. 一.对象和类的概念 1.对象 以一个人为例,对于人,我们可以从他所具有的特征和所具有的行为来进行分析. 特征:体重.身高.性别.年龄...... 行为:吃饭.睡觉.说话...... 上面的例子就是对现实世界中的具体事物进行的描述,这些具体的事务就是对像,比如一个人.一辆车.从以上的分析还可以看出,人

java中有关get方法的使用(具体程序分析)

问题描述 java中有关get方法的使用(具体程序分析) 最近在学习java,用的徐彩霞的java基础教程. 有个例子不太明白. /* /注释部分的get部分有和没有结果一样,想知道为什么要用get? 又必须要用的情况吗? 刚学,懂得比较少,谢谢了~ class Person { private String name; private int age; private void talk() { System.out.print("I'm "+name+" and &quo