1、 用例子来说明面向对象和面向过程的区别java 是一门面向对象的语言,那对面向对象和面向过程不是很清楚的请看看下面的内容,说不定对你有帮助:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2 、黑子先走, 3、绘制画面,4、判断输赢, 5、轮到白子,6、绘制画面,7、判断输赢,8 、返回步骤 2,9、输出最后结果。把上面每个步骤用分别的函数来
2、实现,问题就解决了。而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:1、黑白双方,这两方的行为是一模一样的,2 、棋盘系统,负责绘制画面,3 、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象) 负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统 )来对棋局进行判定。可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象
3、的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。到这里就可以很明显的看出面向对象和面向过程的区别所在了。要成为 Java 高手需要注意的25个学习目标1.你需要精通面向对象分析与设计(OOA/OOD) 、涉及模式(GOF ,J2EEDP
4、)以及综合模式。你应该了解 UML,尤其是 class,object,interaction 以及 statediagrams。2.你需要学习 Java 语言的基础知识以及它的核心类库(collections,serialization,streams,networking,?multithreading,reflection,event,handling,NIO, localization,以及其他) 。 3. 你应该了解JVM,classloaders,classreflect,以及垃圾回收的基本工作机制等。你应该有能力反编译一个类文件并且明白一些基本的汇编指令。4.如果你将要写客户端程序
5、,你需要学习 Web 的小应用程序(applet),必需掌握 GUI设计的思想和方法,以及桌面程序的 SWING,AWT ,?SWT。你还应该对 UI 部件的JavaBEAN 组件模式有所了解。JavaBEANS 也被应用在 JSP 中以把业务逻辑从表现层中分离出来。5.你需要学习 Java 数据库技术,并且会使用至少一种 persistence/ORM 构架,例如Hibernate,JDO,?CocoBase,TopLink,InsideLiberator(国产 JDO 红工厂软件)或者iBatis。6.你还应该了解对象关系的阻抗失配的含义,以及它是如何影响业务对象的与关系型数据库的交互,和
6、它的运行结果,还需要掌握不同的数据库产品运用,比如racle,mysql ,mssqlserver。7.你需要学习 Servlets,JSP,以及 JSTL(StandardTagLibraries)和可以选择的第三方TagLibraries。8.你需要熟悉主流的网页框架,例如 JSF,Struts,Tapestry,Cocoon ,WebWork,以及他们下面的涉及模式,如 MVC/MODEL2。9.你需要学习如何使用及管理 Web 服务器,例如 tomcat,resin,Jrun,并且知道如何在其基础上扩展和维护 Web 程序。10. 你需要学习分布式对象以及远程 API,例如 RMI 和
7、 RMI/IIOP。11. 你需要掌握各种流行中间件技术标准和与 Java 结合实现,比如 Tuxedo、CROBA,当然也包括 JavaEE 本身。12. 你需要学习最少一种的 XMLAPI,例如 JAXP(JavaAPIforXMLProcessing),JDOM(JavaforXMLDocumentObjectModel),DOM4J,或 JAXR(JavaAPIforXMLRegistries)。13. 你应该学习如何利用 Java 的 API 和工具来构建 WebService。例如 JAX-RPC(JavaAPIforXML/RPC),SAAJ?(SOAPwithAttachmen
8、tsAPIforJava),JAXB(JavaArchitectureforXMLBinding),JAXM(JavaAPIforXMLMessaging),?JAXR(JavaAPIforXMLRegistries),或者 JWSDP(JavaWebServicesDeveloperPack)。14. 你需要学习一门轻量级应用程序框架,例如 Spring,PicoContainer,Avalon,以及它们的 IoC/DI 风格(setter,constructor ,interfaceinjection)。15. 你需要熟悉不同的 J2EE 技术,例如 JNDI(JavaNamingandD
9、irectoryInterface),JMS?(JavaMessageService),JTA/JTS(JavaTransactionAPI/JavaTransactionService) ,JMX?(JavaManagementeXtensions),以及 JavaMail。16. 你需要学习企业级 JavaBeans(EJB)以及它们的不同组件模式:Stateless/StatefulSessionBeans,EntityBeans(包含 Bean-?ManagedPersistenceBMP或者Container-ManagedPersistenceCMP和它的 EJB-QL),或者?M
10、essage-DrivenBeans(MDB)。17. 你需要学习如何管理与配置一个 J2EE 应用程序服务器,如 WebLogic,JBoss 等,并且利用它的附加服务,例如簇类,连接池以及分布式处理支援。你还需要了解如何在它上面封装和配置应用程序并且能够监控、调整它的性能。18. 你需要熟悉面向方面的程序设计以及面向属性的程序设计(这两个都被很容易混淆的缩写为 AOP),以及他们的主流 Java 规格和执行。例如 AspectJ 和 AspectWerkz。19. 你需要熟悉对不同有用的 API 和 frame-work 等来为你服务。例如Log4J(logging/tracing),Qu
11、artz?(scheduling) ,JGroups(networkgroupcommunication),JCache(distributedcaching),?Lucene(full-textsearch),JakartaCommons 等等。20. 你应该熟练掌握一种 JavaIDE 例如 sunOne,netBeans,IntelliJIDEA 或者Eclipse。 (有些人更喜欢 VI 或 EMACS 来编写文件。随便你用什么了:)21.Java(精确的说是有些配置)是冗长的,它需要很多的人工代码 (例如 EJB),所以你需要熟悉代码生成工具,例如 XDoclet。22. 你需要熟悉
12、一种单元测试体系(JNunit),并且学习不同的生成、部署工具(Ant,Maven)。23. 你需要熟悉一些在 Java 开发中经常用到的软件工程过程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。24. 你还需要紧跟 Java 发展的步伐,比如现在可以深入的学习 Webwork2.025. 你必需要对实际项目的开发流程有所了解,至少要有两个有实际应用价值的项目,而不是练习项目!因为现在企业看重的是你有没有实际的开发经验,真正开发经验的体现就是你做的项目,也就是有实际应用的项目!java 学习:彻底明白 Java 的 IO 系统2008-
13、12-08 17:11 来源: 评论:0 点击:160一 Input 和 Output 1. stream 代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在 Java 的 IO 中,所有的 stream(包括 Input 和 Out stream)都包括两种类型:1.1 以字节为导向的 stream以字节为导向的 stream,表示以字节为单位从 stream 中读取或往 stream 中写入信息。以字节为导向的 stream 包括下面几种类型:1) input stream:1) ByteArrayInputStream:把内存中的一个缓冲区作为 InputStream
14、 使用2) StringBufferInputStream:把一个 String 对象作为 InputStream3) FileInputStream:把一个文件作为 InputStream,实现对文件的读取操作4) PipedInputStream:实现了 pipe 的概念,主要在线程中使用5) SequenceInputStream:把多个 InputStream 合并为一个 InputStream2) Out stream1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中2) FileOutputStream:把信息存入文件中3) PipedOutputSt
15、ream:实现了 pipe 的概念,主要在线程中使用4) SequenceOutputStream:把多个 OutStream 合并为一个 OutStream1.2 以 Unicode 字符为导向的 stream以 Unicode 字符为导向的 stream,表示以 Unicode 字符为单位从 stream 中读取或往stream 中写入信息。以 Unicode 字符为导向的 stream 包括下面几种类型:1) Input Stream1) CharArrayReader:与 ByteArrayInputStream 对应2) StringReader:与 StringBufferInpu
16、tStream 对应3) FileReader:与 FileInputStream 对应4) PipedReader:与 PipedInputStream 对应2) Out Stream1) CharArrayWrite:与 ByteArrayOutputStream 对应2) StringWrite:无与之对应的以字节为导向的 stream3) FileWrite:与 FileOutputStream 对应4) PipedWrite:与 PipedOutputStream 对应1.3 两种不现导向的 stream 之间的转换InputStreamReader 和 OutputStreamRe
17、ader:把一个以字节为导向的 stream 转换成一个以字符为导向的 stream。2. stream 添加属性2.1 “为 stream 添加属性”的作用运用上面介绍的 Java 中操作 IO 的 API,我们就可完成我们想完成的任何操作了。但通过 FilterInputStream 和 FilterOutStream 的子类,我们可以为 stream 添加属性。下面以一个例子来说明这种功能的作用。如果我们要往一个文件中写入数据,我们可以这样操作:FileOutStream fs = new FileOutStream(“test.txt”);然后就可以通过产生的 fs 对象调用 writ
18、e()函数来往 test.txt 文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的 API 就没有一个能满足我们的需求了。但是通过 FilterInputStream 和FilterOutStream 的子类,为 FileOutStream 添加我们所需要的功能。2.2 FilterInputStream 的各种类型2.2.1 用于封装以字节为导向的 InputStream1) DataInputStream:从 stream 中读取基本类型(int、char 等)数据。2) BufferedInputStream:使用缓
19、冲区3) LineNumberInputStream:会记录 input stream 内的行数,然后可以调用getLineNumber()和 setLineNumber(int)4) PushbackInputStream:很少用到,一般用于编译器开发2.2.2 用于封装以字符为导向的 InputStream1) 没有与 DataInputStream 对应的类。除非在要使用 readLine()时改用BufferedReader,否则使用 DataInputStream2) BufferedReader:与 BufferedInputStream 对应3) LineNumberReader
20、:与 LineNumberInputStream 对应4) PushBackReader:与 PushbackInputStream 对应2.3 FilterOutStream 的各种类型2.2.3 用于封装以字节为导向的 OutputStream1) DataIOutStream:往 stream 中输出基本类型(int、char 等)数据。2) BufferedOutStream:使用缓冲区3) PrintStream:产生格式化输出2.2.4 用于封装以字符为导向的 OutputStream1) BufferedWrite:与对应2) PrintWrite:与对应3. RandomAcc
21、essFile1) 可通过 RandomAccessFile 对象完成对文件的读写操作2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw 可读写3) 可以直接跳到文件中指定的位置4. I/O 应用的一个例子import Java.io.*;public class TestIOpublic static void main(String args)throws IOException/1.以行为单位从一个文件读取数据BufferedReader in =new BufferedReader(new FileReader(“F:nepalonTestIO.java“);S
22、tring s, s2 = new String();while(s = in.readLine() != null)s2 += s + “n“;in.close();/1b. 接收键盘的输入BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in);System.out.println(“Enter a line:“);System.out.println(stdin.readLine();/2. 从一个 String 对象中读取数据StringReader in2 = new StringReader(
23、s2);int c;while(c = in2.read() != -1)System.out.println(char)c);in2.close();/3. 从内存取出格式化输入tryDataInputStream in3 =new DataInputStream(new ByteArrayInputStream(s2.getBytes();while(true)System.out.println(char)in3.readByte();catch(EOFException e)System.out.println(“End of stream“);/4. 输出到文件tryBuffered
24、Reader in4 =new BufferedReader(new StringReader(s2);PrintWriter out1 =new PrintWriter(new BufferedWriter(new FileWriter(“F:nepalon TestIO.out“);int lineCount = 1;while(s = in4.readLine() != null)out1.println(lineCount+ + “:“ + s);out1.close();in4.close();atch(EOFException ex)System.out.println(“End
25、of stream“);/5. 数据的存储和恢复tryDataOutputStream out2 =new DataOutputStream(new BufferedOutputStream(new FileOutputStream(“F:nepalon Data.txt“);out2.writeDouble(3.1415926);out2.writeChars(“nThas was pi:writeCharsn“);out2.writeBytes(“Thas was pi:writeByten“);out2.close();DataInputStream in5 =new DataInput
26、Stream(new BufferedInputStream(new FileInputStream(“F:nepalon Data.txt“);BufferedReader in5br =new BufferedReader(new InputStreamReader(in5);System.out.println(in5.readDouble();System.out.println(in5br.readLine();System.out.println(in5br.readLine();catch(EOFException e)System.out.println(“End of str
27、eam“);/6. 通过 RandomAccessFile 操作文件RandomAccessFile rf =new RandomAccessFile(“F:nepalon rtest.dat“, “rw“);for(int i=0; i10; i+)rf.writeDouble(i*1.414);rf.close();rf = new RandomAccessFile(“F:nepalon rtest.dat“, “r“);for(int i=0; i10; i+)System.out.println(“Value “ + i + “:“ + rf.readDouble();rf.close
28、();rf = new RandomAccessFile(“F:nepalon rtest.dat“, “rw“);rf.seek(5*8);rf.writeDouble(47.0001);rf.close();rf = new RandomAccessFile(“F:nepalon rtest.dat“, “r“);for(int i=0; i10; i+)System.out.println(“Value “ + i + “:“ + rf.readDouble();rf.close();关于代码的解释(以区为单位):1区中,当读取文件时,先把文件内容读到缓存中,当调用 in.readLin
29、e()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”) 。1b 区中,由于想以缓存字节读取方式从标准 IO(键盘)中读取数据,所以要先把标准 IO(System.in)转换成字符导向的 stream,再进行 BufferedReader 封装。2区中,要以字符的形式从一个 String 对象中读取数据,所以要产生一个StringReader 类型的 stream。4区中,对 String 对象 s2读取数据时,先把对象中的数据存入缓存中,再从缓冲中进行读取;对 TestIO.out 文件进行操作时,先把格式化后的信息输出到缓存中,再把缓存中的信息输出到文件中。5区中,对 Data.txt 文件进行输出时,是先把基本类型的数据输出屋缓存中,再把缓存中的数据输出到文件中;对文件进行读取操作时,先把文件中的数据读取到缓存中,再从缓存中以基本类型的形式进行读取。注意 in5.readDouble()这一行。因为写入第一个writeDouble(),所以为了正确显示。也要以基本类型的形式进行读取。6区是通过 RandomAccessFile 类对文件进行操作。