场景1?
AQ我今天开始用面向对象的方法设计程序了Q?
BQ你怎么做的Q?
AQ我把保存文件、加载文件封装成了一个类Q以后只要调用这个类可以实现文件操作了?
场景2?
AQ我开始学习Java了,面向对象的语aQ你不要再学VB了,好土呀Q?
BQVB怎么了?
AQVB是面向过E的Q已l过时了QJava中都是类Q很旉Q?
BQVB中也有类呀Q?
AQ(无语Q?
场景3?
AQ面向对象思想是好呀Q我真的M开Java了!
BQ你又用什么高技术了Q?
AQ我今天从一个操U|据库的类l承了一个子c,然后重写了它的保存到数据库的Ҏ(gu)Q然后把数据通过Socket发送到了远E客L了,而调用者根本不知道Q哈哈!
场景4?
AQ我推荐你用的Java不错吧?
BQ真是不错,面向对象是好,JDK里边也有好多好多的类可以用,不用像在VB里边那样要去查API文了?
AQ但是我听说现在又出了个面向斚w~程Q咱们看来又落伍了呀Q看来做~程真的不是长久之计?
写几个类是面向对象了吗Q承父cd是ؓ了重用父cȝ代码吗?覆盖父类的方法就可以瞒天qv了吗QVB中也有类Q它是面向对象吗Q?
cM对象
“c?#8221;?#8220;对象”是面向对象编E中最基本的概念,从语a的角度来Ԍ“c?#8221;是用戯定义的具有一定行为的数据cdQ?#8220;对象”则是“c?#8221;q种数据cd的变量。通俗的讲Q?#8220;c?#8221;是具有相同或怼行ؓ的事物的抽象Q?#8220;对象”?#8220;c?#8221;的实例,是是一l具有相x的代码和数据的l合体,是有一定责ȝ实体?
cLw还可以q一步抽象ؓcdQ类型是一U更高层ơ上的抽象,它只用来描述接口Q比如抽象类和接口就是一U类型。当一个类型的接口包含另外一个类型的接口Ӟ我们可以说它是此类型的子类型。类型是用来标识特定接口的,如果一个对象接受某个接口定义的所有行为,那么我们可以说该对象具有该cd。一个对象同时拥有多U类型?
面向对象~程的特?
面向对象~程有三个特性:装Q承,多态。这三个Ҏ(gu)从低到高U描qC面向对象的特征。一U语a只有同时具备q三U特性才能被UCؓ面向对象的语a。VB中也有类Q它的类也支持封装和单的l承Q但是它不支持所有的l承语义和多态,因此VB只能被称为基于对象的语言?
装是所有抽象数据类型(ADTQ的Ҏ(gu),很多刚刚接触面向对象的h认ؓ装是是面向对象。将E序按照一定的逻辑分成多个互相协作的部分,q将对外界有用的E_的部分暴露出来,而将会发生的改变隐藏hQ外界只能通过暴露的部分向q个对象发送操作请求从而n受对象提供的服务Q而不必管对象内部是如何运行的Q这是装。理解封装是理解面向对象的第一个步骤,40%的程序员寚w向对象的理解仅停留在装q个层次?
l承也称为派生,l承关系中,被承的UCؓ基类Q从基类l承而得的被UCؓzcL者子cR承是保持对象差异性的同时׃n对象怼性的复用。能够被l承的类L含有q只含有它所抽象的那一cM务的共同特点。承提供了实现复用Q只要从一个类l承Q我们就拥有了这个类的所有行为。理解承是理解面向对象的第二个步骤Q?0%的程序员寚w向对象的理解仅停留在l承q个层次。语义上?#8220;l承”表示“是一U(is-aQ?#8221;的关pR很多h体会Cl承在代码重用方面的优点Q而忽视了l承的语义特征。于是很多滥用承的情况发生了Q关于这一Ҏ(gu)们将会在后边介绍?
多态是“允许用户父对象讄成ؓ一个或更多的它的子对象相等的技术,赋值后Q基cd象就可以Ҏ(gu)当前赋值给它的zcd象的Ҏ(gu)以不同的方式运?#8221;QCharlie CalvertQ。多态扩大了对象的适应性,改变了对象单一l承的关pR多态是行ؓ的抽象,它得同名方法可以有不同的响应方式,我们可以通过名字调用某一Ҏ(gu)而无需知道哪种实现被执行Q甚x需知道执行q个实现的对象类型。多态是面向对象~程的核心概念,只有理解了多态,才能明白什么是真正的面向对象,才能真正发挥面向对象的最大能力。不q可惜的是,只有极少数程序员能真正理解多态?
我们l常会遇到编码问题?/span>JavaL国际化的语言Q是因ؓ它的class文g采用UTF-8Q?/span>JVMq行时?/span>UTF-16Q至于ؓ什?/span>JVM中要采用UTF-16Q我没看q?/span> 相关的资料,但我猜可能是因ؓJAVA里面一个字W?/span>(char)是16位的Q而UTF-16正是双字节编码)Q都?/span>unicode的编码?/span>
unicode 的目标就是能支持世界上所有的字符集,也就是说几乎所有的字符集包含的字符?/span>unicode中都有对应的~码。在unicode中,字符与代码的映射?/span> p,是unicode字符集,UCؓUCS(Unicode Character Set)Q每?/span>unicode字符~码UCؓcode pointQ代码点Q)?/span>UTF-8?/span>UTF-16是不同的UCS~码Ҏ(gu)Q?/span>UTF是UCS Transformation Format?
?/span>Java 中,String?/span>getBytes()Ҏ(gu)是对特定的字符?/span>(unicode)按照l定的字W集q行~码Q?/span>encodeQ,new String()则可以按照某个字W集字节流转换?/span>unicodeQ?/span>decodeQ?/span>Java里面的每一?/span>String都是unicode~码?/span>
再来看页面,如果不做Ҏ(gu)处理Q?/span>Form的提交就按照面?/span>ContentType讄中的字符集进行编码{换,发送到后台Q后台必d?/span>req.setCharacterEncoding来指定参数的~码格式(不同的应用服务器应有不同的指定方?/span>)Q才能正解码?/span>
Java 里面?/span>encode?/span>decode都是相对?/span>unicode而言的,encode的意思是?/span>char[] --> XXX Encoding byte[]Q?/span>decode是?/span>XXX Encoding byte[] --> char[]。^常,当我们说“?/span>GBK~码转换?/span>UTF-8~码”的时候,实际的意思就是:GBK Encoding byte[] --> UTF-8 Encoding byte[]Q这U{换只有在需要用byte[]传输数据的时候才有意义,否则便是毫无意义的?/span>
首先要说明的一Ҏ(gu)Q?/span>Java中的String对象是一?/span>unicode~码的字W串?/span>
但是Q我们通常会听到有Q?/span>“我们需要将String?/span>ISO-8859-1转换?/span>GBK~码”Q这又是怎么回事呢?实际上,我们q?strong>不是?/span>“?/span> 一个由ISO-8859-1~码?/span>String转换?/span>GBK~码?/span>String”Q反复说明的是,JAVA中的String都是unicode~码的,所以不存在“ISO- 8859-1~码?/span>String”?/span>“GBK~码?/span>String”q样的说法。而需要{换的唯一的原因是Stringq行了错误的~码。我们经怼到?/span>ISO-8859- 1转换?/span>GBK/UTF-8{等q样的需求。所谓的转换q程是:String --> byte[] -->String?/span>
也许 你非常清楚这个过E的代码Q?/span>new String(text.getBytes("ISO-8859-1"),"GBK")。但是,要真正理解v来ƈ不是那么单。表面上看似乎很Ҏ(gu)理解Q?/span> 不就是将text String对象按照ISO-8859-1的方式编码ؓbyte[]然后再把它按?/span>GBK的方式{换ؓString吗?但是q句代码很容易会被误解ؓQ?/span> “?/span>text String?/span>ISO-8859-1转换?/span>GBK~码”Q这U说法是错误的。难道你见过用这L代码Q?/span>new String(text.getBytes("GBK"),"UTF-8")来对Stringq行~码转换的吗Q?/span>
之所以你会经常看?/span>new String(text.getBytes("ISO-8859-1"),"GBK")q句代码Q是因ؓ一?/span>GBK的字节流被错误地?/span>ISO-8859- 1的方式{换ؓStringQ?/span>unicodeQ了Q发生这U情冉|普遍的地Ҏ(gu)一?/span>GBK~码的网向后台提交数据的时候,有可能会看到这句代码的?/span> 现?/span>GBK的流被错误的当成ISO8859-1的流Q所以便得到了一个错误的String。由?/span>ISO8859-1是单字节~码Q所以每个字节被按照原样 转换?/span>StringQ也是_虽然q是一个错误的转换Q但~码没有改变Q所以我们仍然有Z把编码{换回来!所以那句经典的new String(text.getBytes("ISO-8859-1"),"GBK")便出C?/span>
如果pȝ误以为是其它~码格式Q就有可能再也{换不回来了,因ؓ~码转换q不是负负得正那么简单的
2.你需要学习JAVA语言的基知识以及它的核心cd(collectionsQserializationQstreamsQnetworkingQ?multithreadingQreflectionQeventQhandlingQNIOQlocalizationQ以及其??/p>
3.你应该了解JVMQclassloadersQclassreflectQ以及垃圑֛收的基本工作机制{。你应该有能力反~译一个类文gq且明白一些基本的汇编指o?/p>
4.如果你将要写客户端程序,你需要学习WEB的小应用E序(applet)Q必需掌握GUI设计的思想和方法,以及桌面E序的SWINGQAWTQ?SWT。你q应该对UI部g的JAVABEANlg模式有所了解。JAVABEANS也被应用在JSP中以把业务逻辑从表现层中分d来?/p>
5.你需要学习java数据库技术,如JDBCAPIq且会用至一Upersistence/ORM构架Q例如HibernateQJDOQ?CocoBaseQTopLinkQInsideLiberator(国JDOU工厂Y?或者iBatis?/p>
6.你还应该了解对象关系的阻抗失配的含义Q以及它是如何媄响业务对象的与关pd数据库的交互Q和它的q行l果Q还需要掌握不同的数据库品运用,比如:oracleQmysqlQmssqlserver?/p>
7.你需要学习JAVA的沙盒安全模?classloadersQbytecodeverificationQmanagersQpolicyandpermissionsQ?br>codesigningQ?digitalsignaturesQcryptographyQcertificationQKerberosQ以及其?q有不同的安?认证 APIQ例如JAAS(JavaAuthenticationandAuthorizationService)QJCE (JavaCryptographyExtension)QJSSE(JavaSecureSocketExtension)Q以及JGSS (JavaGeneralSecurityService)?/p>
8.你需要学习ServletsQJSPQ以及JSTL(StandardTagLibraries)和可以选择的第三方TagLibraries?/p>
9.你需要熟(zhn)主的|页框架Q例如JSFQStrutsQTapestryQCocoonQWebWorkQ以及他们下面的涉及模式Q如MVC/MODEL2?/p>
10.你需要学习如何用及理WEB服务器,例如tomcatQresinQJrunQƈ且知道如何在其基上扩展和l护WEBE序?/p>
11.你需要学习分布式对象以及q程APIQ例如RMI和RMI/IIOP?
12.你需要掌握各U流行中间g技术标准和与javal合实现Q比如Tuxedo、CROBAQ当然也包括javaEE本n?/p>
13.你需要学习最一U的XMLAPIQ例如JAXP(JavaAPIforXMLProcessing)QJDOM(JavaforXMLDocumentObjectModel)QDOM4JQ或JAXR(JavaAPIforXMLRegistries)?/p>
14.你应该学习如何利用JAVAAPI和工h构徏WebService。例如JAX-RPC(JavaAPIforXML/RPC)QSAAJ (SOAPwithAttachmentsAPIforJava)QJAXB(JavaArchitectureforXMLBinding)QJAXM(JavaAPIforXMLMessaging)Q?JAXR(JavaAPIforXMLRegistries)Q或者JWSDP(JavaWebServicesDeveloperPack)?/p>
15.你需要学习一门轻量应用E序框架Q例如SpringQPicoContainerQAvalonQ以及它们的IoC/DI风格(setterQconstructorQinterfaceinjection)?/p>
16.你需要熟(zhn)不同的J2EE技术,例如JNDI(JavaNamingandDirectoryInterface)QJMS (JavaMessageService)QJTA/JTS(JavaTransactionAPI/JavaTransactionService)QJMX (JavaManagementeXtensions)Q以及JavaMail?/p>
17.你需要学习企业JavaBeans(EJB)以及它们的不同组件模式:Stateless/StatefulSessionBeansQEntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL)Q或?Message-DrivenBeans(MDB)?/p>
18.你需要学习如何管理与配置一个J2EE应用E序服务器,如WebLogicQJBoss{,q且利用它的附加服务Q例如簇c,q接池以及分布式处理支援。你q需要了解如何在它上面封装和配置应用E序q且能够监控、调整它的性能?/p>
19.你需要熟(zhn)面向方面的E序设计以及面向属性的E序设计(q两个都被很Ҏ(gu)h的羃写ؓAOP)Q以及他们的LJAVA规格和执行。例如AspectJ和AspectWerkz?/p>
20.你需要熟(zhn)对不同有用的API和frame work{来Z服务。例如Log4J(logging/tracing)QQuartz (scheduling)QJGroups(networkgroupcommunication)QJCache(distributedcaching)Q?Lucene(full-textsearch)QJakartaCommons{等?/p>
21.如果你将要对接或者正和旧的系l或者本地^収ͼ你需要学习JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)?/p>
22.你需要熟(zhn)JINI技术以及与它相关的分布式系l,比如掌握CROBA?/p>
23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs)Q例如Portlets(168)QJOLAP(69)QDataMiningAPI(73)Q等{?/p>
24.你应该熟l掌握一UJAVAIDE例如sunOneQnetBeansQIntelliJIDEA或者Eclipse?有些人更喜欢VI或EMACS来编写文件。随便你用什么了Q?
25.JAVA(_的说是有些配|?是冗长的Q它需要很多的人工代码(例如EJB)Q所以你需要熟(zhn)代码生成工P例如XDoclet?/p>
26.你需要熟(zhn)一U单元测试体p?JNunit)Qƈ且学习不同的生成、部|工?AntQMaven)?/p>
27.你需要熟(zhn)一些在JAVA开发中l常用到的Y件工E过E。例如RUP(RationalUnifiedProcess)andAgilemethodologies?/p>
28.你需要能够深入了解加熟练操作和配|不同的操作pȝQ比如GNU/linuxQsunsolarisQmacOS{,做ؓ跨^台Y件的开发者?/p>
29.你还需要紧跟java发展的步伐,比如现在可以深入的学习javaMEQ以及各Ujava新规范,技术的q用Q如新v的web富客L技术?/p>
30.你必需要对opensource有所了解Q因java的很多技术直接是靠开源来驱动发展的,如java3D技术?br>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=94763