第一篇:java自学心得
Java 自学心得体会
学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。
在这里我只想补充一点看法,很多人学习Java是从《ThinkinginJava》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《ThinkinginJava》并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。
对于初学者来说,最好是找一本Java入门的书籍,但是比较完整的循序的介绍Java的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《ThinkinginJava》,来加深对Java的理解和原理的运用,同时又可以完整的了解Java的整个体系。
对于Java的入门书籍,蔡学镛推荐的是Oreilly的《ExploringJava,2ndEdition》或者《JavainaNutshell,2ndEdition(针对C++背景)》,我并没有看过这两本书。其实我觉得电子工业出版社的《Java2编程详解》或者《Java2从入门到精通》就很不错。
在所有的Java书籍当中,其实最最有用的,并不是O 'reilly的JavaSerials,真正最最有用处是JDK的Documentation!几乎你想获得的所有的知识在Documentation里面全部都有,其中最主要的部分当然是Java基础类库的API文档,是按照package来组织的,对于每一个class都有详细的解释,它的继承关系,是否实现了某个接口,通常用在哪些场合,还可以查到它所有的public的属性和方法,每个属性的解释,意义,每个方法的用途,调用的参数,参数的意义,返回值的类型,以及方法可能抛出的异常等等。可以这样来说,所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言,和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗,如果你有足够的能力来直接通过Documentation来学习Java的类库,那么基本上就不需要看其他的书籍了。除此之外,Documentation也是编程必备的手册,我的桌面上有三个Documentation的快捷方式,分别是J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation,什么其他的书籍都不需要了。
对于JavaWeb编程来说,最核心的是要熟悉和掌握HTTP协议,这个就和Java无关了,在熟悉HTTP协议之后,就需要熟悉Java的实现HTTP协议的类库,也就是ServletAPI,所以最重要的东西就是ServletAPI。当然对于初学者而言,直接通过ServletAPI来学习Web编程有很大的难度,我推荐O 'reilly的《JavaServerPages》这本书来学习Web编程。
EJB的书籍当中,《EnterpriseJavaBeans,2ndEdition》是一本很不错的书,EJB的学习门槛是比较高,入门很难,但是这本书完全降低了学习的难度,特别重要的一点是,EJB的学习需要结合一种AppServer的具体实现,所以在学习EJB的同时,必须同步的学习某种AppServer,而这本书相关的出了三本书,分别是Weblogic6.1,Websphere4.0
和JBoss3.0上面部署书中例子的实做。真是既有理论,又有实践。在学习EJB的同时,可以边看边做,EJB的学习会变得很轻松。
但是这本书也有一个问题,就是版本比较旧,主要讲EJB1.1规范和部分EJB2.0的规范。而EdRoman写的《MasteringEJB2.0》这本书完全是根据EJB2.0规范写的,深入浅出,覆盖了EJB编程的各个方面,并且还有很多编程经验tips,也是学习EJB非常推荐的书籍之一。
如果是结合Weblogic来学习J2EE的话,《J2EE应用与BEAWeblogicServer》绝对是首选读物,虽然是讲述的Weblogic6.0,仍然值得购买,这本书是BEA官方推荐的教材,作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署,实践指导意义非常强。
在掌握了Java平台基础知识和J2EE方面的知识以后,更进一步的是学习如何运用OO的方法进行软件的设计,那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》,是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式,是设计师的必读书籍。
JavaLearningPath
(三)过程篇
每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。
学习Java的第一步是安装好JDK,写一个HelloWorld,其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探讨。
第二步是学习Java的语法。Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己琢磨出来的,花了很久的时间。不过后来我看到《ThinkinginJava》这本书上面是讲了这些概念的。
第三步是学习Java的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C的经验,我是大概花了一个月左右吧,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了不下5遍,才彻底领悟了。不过我想如果有C++经验的话,应该一两天时间足够了。那么在这个过程中,可以多看看《ThinkinginJava》这本书,对面向对象的讲解非常透彻。可惜的是我学习的时候,并
没有看到这本书,所以自己花了大量的时间,通过自己的尝试和揣摩来学会的。
第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jrelibrt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个,我没有统计过。但是真正对于我们来说最核心的只有4个,分别是
java.lang.*;
java.io.*;
java.util.*;
java.sql.*;
这四个包的学习,每个包的学习都可以写成一本厚厚的教材,而O 'reilly也确实是这样做的。我觉得如果时间比较紧,是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的:
首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。
对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包,所以不可能详细的介绍每个类的用法,但是我反复强调,我给你们讲这些包的不是要告诉你们类的方法是怎么调用的,也不要求你们记住类的方法调用,而是要你们了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That 'all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。
第五步,通过上面的学习,如果学的比较扎实的话,就打好了Java的基础了,剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步,Java的自学能力已经被培养出来了,可以到了直接学习Documentation的水平了。除了要做GUI编程之外,JDK里面其他会有用处的包是这些:
java.text.*;
java.net.*;
javax.naming.*;
这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。
第六步,JavaWeb编程
Web编程的核心是HTTP协议,HTTP协议和Java无关,如果不熟悉HTTP协议的话,虽然也可以学好Servlet/JSP编程,但是达不到举一反三,一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话,又有了Java编程的良好的基础,学习Servlet/JSP简直易如反掌,我学习Servlet/JSP就用了不到一周的时间,然后就开始用JSP来做项目了。
在Servlet/JSP的学习中,重头仍然是ServletDocumentation。ServletAPI最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在WebServer和Brower之间交谈。另外对JSP,还需要熟悉几个常用JSP的标记,具体的写法记不住的话,临时查就是了。
此外JavaWeb编程学习的重点要放在WebApplication的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照MVC设计模式的要求,运用Servlet和JSP分别完成不同的逻辑层,掌握如何在Servlet和JSP之间进行流程的控制和数据的共享,以及WebApplication应该如何配置和部署。
第七步,J2EE编程
以上的学习过程如果是比较顺利的话,进行到这一步,难度又陡然提高。因为上面的知识内容都是只涉及一个方面,而像EJB,JMS,JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶,所以掌握起来难度比较大。
首先一定要学习好JNDI,JNDI是AppServer定位服务器资源(EJB组件,Datasouce,JMS)查找方法,如果对JNDI不熟悉的话,EJB,JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包,运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置,就需要看看专门的文档规范了,比如web.xml的写法,ejb-jar.xml的写法等等。针对每种不同的AppServer,还有自己的服务资源配置文件,也是需要熟悉的。
然后可以学习JTA,主要是要理解JTA对于事务的控制的方法,以及该在什么场合使用JTA。这里可以简单的举个例子,我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit()),做为一个原子操作,但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作,你能做的到吗?这时候只能用JTA了。假设操作过程是先往A数据库插一条记录,然后删除B数据库另一个记录,我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话,由AppServer来完成控制。
在学习EJB之前要学习对象序列化和RMI,RMI是EJB的基础。接着学习JMS和EJB,对于EJB来说,最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的,以及在什么情况下要用到EJB。
在学习完EJB,JMS这些东西之后,你可能会意识到要急不可待学习两个领域的知识,一个是UML,另一个是DesignPattern。Java企业软件的设计非常重视框架(Framework)的设计,一个好的软件框架是软件开发成功的必要条件。在这个时候,应该开始把学习的重点放在设计模式和框架的学习上,通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。
J2EE规范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外还有很多很多的企业技术,这里不一一进行介绍了。
另外还有一个最新领域WebServices。WebServices也完全没有任何新东西,它像是一种黏合剂,可以把不同的服务统一起来提供一个统一的调用接口,作为使用者来说,我只要获得服务提供者给我的WSDL(对服务的描述),就够了,我完全不知道服务器提供者提供的服务究竟是EJB组件,还是.Net组件,还是什么CORBA组件,还是其他的什么实现,我也不需要知道。WebServices最伟大的地方就在于通过统一的服务提供方式和调用方式,实现了整个Internet服务的共享,是一个非常令人激动的技术领域。WebServices好像目前还没有什么很好的书籍,但是可以通过在网络上面查资料的方式来学习。
JavaLearningPath
(四)方法篇
Java作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习Documentation编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握Java。
举个例子,我们都编过HelloWorld
publicclassHelloWorld{
publicstaticvoidmain(String[]args){
System.out.println(“HelloWorld ”);
}
}
很多初学者不是很理解为什么main方法一定要这样来定义publicstaticvoidmain(String[]args),能不能不这样写?包括我刚学习Java的时候也有这样的疑问。想知道答案吗?很简单,你把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的,把String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。
我当初学习Java的时候就是这样做的,把HelloWorld程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这样定义的了。
此外,我对于staic,public,private,Exception,try{}catch{}finally{}等等等等一开始都不是很懂,都是把参考书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。
其中特别值得一提的是JDK有一个非常棒的调试功能,-verbose
java–verbose
javac–verbose以及其它很多JDK工具都有这个选项
-verbose可以显示在命令执行的过程中,JVM都依次加载哪里Class,通过这些宝贵的调试信息,可以帮助我们分析出JVM在执行的过程中都干了些什么。
另外,自己在学习过程中,写的很多的这种破坏例程,应该有意识的分门别类的保存下来,在工作中积累的典型例程也应该定期整理,日积月累,自己就有了一个代码库了。遇到类似的问题,到代码库里面Copy&Paste,Search&Replace,就好了,极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层,形成一个通用的类库,封装好。那么可复用性就更强了。
所以我觉得其实不是特别需要例程的,自己写的破坏例程就是最好的例子,如果你实在对自己写的代码不放心的话,我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip,解开来就可以完整的看到整个JDK基础类库,也就是rt.jar的Java源代码,你可以参考一下Sun是怎么写Java程序的,规范是什么样子的。我自己在学习Java的类库的时候,当有些地方理解的不是很清楚的时候,或者想更加清晰的理解运作的细节的时候,往往会打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。
第二篇:自学Java心得
要学好java找一份工作,需要很大的毅力,具体学多长时间就可以找工作,要看个人的悟性和学习能力,以我们宿舍6个人来说,计算机专业大专学历,我比较笨在大学里自学了一年左右的时间,毕业后在北京一家做移动增值的公司上班了。同宿舍的其它5个人,其中一个比较强,自学半年就去深圳华为上班了,2个找了个培训班学了4个月,现在都干上开发了,还有2个家里有关系,工作和计算机没关系。
总的来说,经济不困难的话,找个培训班比较好,学得比较全面,有老师指导学起来也不困难,就业比较顺利。如果经济条件不好,自己又喜欢这行,自学能坚持的话那就自学,老大不小了,总不能老伸手找家里拿钱不是。选择自学的话,基本上要分以下几个阶段:
1、要学java,肯定首先得把Java语言本身给掌握了,万事开头难,学java最难的也是java的入门,学习顺序是先掌握java的语法(多练就行),再掌握java面向对象的思想(封装、继承、多态、接口这些东西是重点,要多理解),接下来就是熟悉java常用的API(集合、IO等,主要是跟着书多写多练),这些东西掌握后,Java语言就算入门了。入门java推荐大家下载张孝祥的《java就业培训教程》视频教程,学java的没有不知道这套视频的,我们宿舍当时都是学这套视频入门的。这套视频最大的好处简单易懂,并引用了很多实用案例,并且还有配套书(书名好像也是java就业培训教程,新华书店有),省得忘了的地方,动不动对着电脑翻视频了。还有一些视频也比较好,例如孙鑫的java视频,马士兵的java视频等。不过对初学者而言,选中一套视频了就跟着好好学,不要下很多视频,东抓一把、西抓一把,最后啥也没学到。
2、有java基础了想马上从事实际开发还是不够的,接下来就需要掌握1-2门数据库技术了,对java来说数据库当然是oracle和mysql。oracle数据库现在还没发现好的视频,不过现在大学都学了数据库,有了数据库基础后,找本好书学oracle也就不难了。这里推荐何明的《从实践中学习Oracle/SQL》,作者来头很大,有非常深的oracle功底,书写得由浅入深,相当不错。对程序员来讲,学数据库关键是把增删改查的sql语句学好了就OK了,不要去抠什么数据库管理方面的东西。学了oracle后,要把数据库和java程序联系起来,这时候就要学jdbc了,jdbc不难,网上很多资料,大概一周时间就可以掌握了。
3、有了上面的基础后,恭喜你已经具备用java开发企业级应用的基础了。这时候你可以学习javaweb试着做点小项目玩了。不过学javaweb需要很多杂七杂八的知识点,比如xml、html、javascript、tomcat服务器等,学了这些后,大家才可以学servlet、jsp。学javaweb推荐大家买《深入体验Javaweb开发内幕-核心基础》这本书,还是张孝祥写的,这本书写的书很有特点,很细很深入,书上还带大量的实验案例,一步步讲得非常清晰,非常适合初学者。学javaweb这本书绝对是首选,并且这本书也有配套视频,在网上有下,不过视频只有前4章,比较可惜,希望张孝祥老师能早日录制全套视频。还有些视频和书也不错,比如李兴华的JSP视频教程、孙鑫的JAVA WEB 开发详解等,这些也不错,在网上都有免费下的。
4、接下来为找工作就要学strutshibernatespringajax这些流行技术了。这些技术我学习的时候没有视频,买的孙卫琴的书学,花了我大半年时间才学明白。现在幸福多了,网上有很多视频,个人推荐大家下传智播客的视频看。这个机构的老师很牛课程很有深度,真正能学到技术,不会误了大家。不过他们的视频里老打广告,很烦。书籍推荐struts看孙卫琴的,hibernate看夏昕的,spring看林信良的,具体书名叫什么忘了,大家google一下就清楚了。
学完上面这些就可以试着找工作了,我找了40天找着了。顺便再说一句,自学不可能不碰到问题,CSDN的论坛很不错,有问题上去问,一般都会有人回答你。要找培训班的话北京的传智播客还不错,我宿舍的2个就在那里,教学质量高,学完后很轻松都上班了,这家机构就是在外地没有分部,想培训要去北京,生活费用高,花费大。北京还有一些培训也不错,达内什么的,可以看看。
第三篇:Java自学成长路线
Java自学成长路线
JAVA自学之路 一:学会选择
决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机、嵌入式、游戏、3G、测试等。
JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此境界?我想是因为编程语言之间有共通之处,领会了编程的精髓,自然能够做到一通百通。如何学习程序设计理所当然也有许多共通的地方。
1.1 培养兴趣
兴趣是能够让你坚持下去的动力。如果只是把写程序作为谋生的手段的话,你会活的很累,也太对不起自己了。多关心一些行业趣事,多想想盖茨。不是提倡天天做白日梦,但人要是没有了梦想,你觉得有味道吗?可能像许多深圳本地农民一样,打打麻将,喝喝功夫茶,拜拜财神爷;每个月就有几万十几万甚至更多的进帐,凭空多出个“食利阶层”。你认为,这样有味道吗?有空多到一些程序员论坛转转,你会发现,他们其实很乐观幽默,时不时会冒出智慧的火花。
1.2 慎选程序设计语言
男怕入错行,女怕嫁错郎。初学者选择程序设计语言需要谨慎对待。软件开发不仅仅是掌握一门编程语言了事,它还需要其他很多方面的背景知识。软件开发也不仅仅局限于某几个领域,而是已经渗透到了各行各业几乎每一个角落。
如果你对硬件比较感兴趣,你可以学习C语言/汇编语言,进入硬件开发领域。如果你对电信的行业知识及网络比较熟悉,你可以在C/C++等之上多花时间,以期进入电信软件开发领域。如果你对操作系统比较熟悉,你可以学习C/Linux等等,为Linux内核开发/驱动程序开发/嵌入式开发打基础。如果你想介入到应用范围最广泛的应用软件开发(包括电子商务电子政务系统)的话,你可以选择J2EE或.NET,甚至LAMP组合。每个领域要求的背景知识不一样。做应用软件需要对数据库等很熟悉。总之,你需要根据自己的特点来选择合适你的编程语言。
1.3 要脚踏实地,快餐式的学习不可取
先分享一个故事。
有一个小朋友,他很喜欢研究生物学,很想知道那些蝴蝶如何从蛹壳里出来,变成蝴蝶便会飞。有一次,他走到草原上面看见一个蛹,便取了回家,然后看着,过了几天以后,这个蛹出了一条裂痕,看见里面的蝴蝶开始挣扎,想抓破蛹壳飞出来。这个过程达数小时之久,蝴蝶在蛹里面很辛苦地拼命挣扎,怎么也没法子走出来。这个小孩看着看着不忍心,就想不如让我帮帮它吧,便随手拿起剪刀在蛹上剪开,使蝴蝶破蛹而出。但蝴蝶出来以后,因为翅膀不够力,变得很臃肿,飞不起来。
这个故事给我们的启示是:欲速则不达。
浮躁是现代人最普遍的心态,能怪谁?也许是贫穷落后了这么多年的缘故,就像当年的大跃进一样,都想大步跨入共产主义社会。现在的软件公司、客户、政府、学校、培训机构等等到处弥漫着浮躁之气。就拿笔者比较熟悉的深圳IT培训行业来说吧,居然有的打广告宣称“参加培训,100%就业”,居然报名的学生不少,简直是藐视天下程序员。社会环境如是,我们不能改变,只能改变自己,闹市中的安宁,弥足珍贵。许多初学者C++/JAVA没开始学,立马使用VC/JBuilder,会使用VC/JBuilder开发一个Hello World程序,就忙不迭的向世界宣告,“我会软件开发了”,简历上也大言不惭地写上“精通VC/JAVA”。结果到软件公司面试时要么被三两下打发走了,要么被驳的体无完肤,无地自容。到处碰壁之后才知道捧起《C++编程思想》《JAVA编程思想》仔细钻研,早知如此何必当初呀。
“你现在讲究简单方便,你以后的路就长了”,好象也是佛经中的劝戒。
1.4 多实践,快实践
彭端淑的《为学一首示子侄》中有穷和尚与富和尚的故事。
从前,四川边境有两个和尚,一个贫穷,一个有钱。一天,穷和尚对富和尚说:“我打算去南海朝圣,你看怎么样?”富和尚说:“这里离南海有几千里远,你靠什么去呢?”穷和尚说:“我只要一个水钵,一个饭碗就够了。”富和尚为难地说:“几年前我就打算买条船去南海,可至今没去成,你还是别去吧!” 一年以后,富和尚还在为租赁船只筹钱,穷和尚却已经从南海朝圣回来了。
这个故事可解读为:任何事情,一旦考虑好了,就要马上上路,不要等到准备周全之后,再去干事情。假如事情准备考虑周全了再上路的话,别人恐怕捷足先登了。软件开发是一门工程学科,注重的就是实践,“君子动口不动手”对软件开发人员来讲根本就是错误的,他们提倡“动手至上”,但别害怕,他们大多温文尔雅,没有暴力倾向,虽然有时候蓬头垢面的一副“比尔盖茨”样。有前辈高人认为,学习编程的秘诀是:编程、编程、再编程,笔者深表赞同。不仅要多实践,而且要快实践。我们在看书的时候,不要等到你完全理解了才动手敲代码,而是应该在看书的同时敲代码,程序运行的各种情况可以让你更快更牢固的掌握知识点。
1.5 多参考程序代码
程序代码是软件开发最重要的成果之一,其中渗透了程序员的思想与灵魂。许多人被《仙剑奇侠传》中凄美的爱情故事感动,悲剧的结局更有一种缺憾美。为什么要以悲剧结尾?据说是因为写《仙剑奇侠传》的程序员失恋而安排了这样的结局,他把自己的感觉融入到游戏中,却让众多的仙剑迷扼腕叹息。
多多参考代码例子,对JAVA而言有参考文献[4.3],有API类的源代码(JDK安装目录下的src.zip文件),也可以研究一些开源的软件或框架。
1.6 加强英文阅读能力
对学习编程来说,不要求英语, 但不能一点不会,。最起码像JAVA API文档(参考文献[4.4])这些东西还是要能看懂的,连猜带懵都可以;旁边再开启一个“金山词霸”。看多了就会越来越熟练。在学JAVA的同时学习英文,一箭双雕多好。另外好多软件需要到英文网站下载,你要能够找到它们,这些是最基本的要求。英语好对你学习有很大的帮助。口语好的话更有机会进入管理层,进而可以成为剥削程序员的“周扒皮”。
1.7 万不得已才请教别人
笔者在ChinaITLab网校的在线辅导系统中解决学生问题时发现,大部分的问题学生稍做思考就可以解决。请教别人之前,你应该先回答如下几个问题。
你是否在google中搜索了问题的解决办法?
你是否查看了JAVA API文档?
你是否查找过相关书籍?
你是否写代码测试过?
如果回答都是“是”的话,而且还没有找到解决办法,再问别人不迟。要知道独立思考的能力对你很重要。要知道程序员的时间是很宝贵的。
1.8 多读好书
书中自有颜如玉。比尔?盖茨是一个饱读群书的人。虽然没有读完大学,但九岁的时候比尔?盖茨就已经读完了所有的百科全书,所以他精通天文、历史、地理等等各类学科,可以说比尔?盖茨不仅是当今世界上金钱的首富,而且也可以称得上是知识的巨富。
笔者在给学生上课的时候经常会给他们推荐书籍,到后来学生实在忍无可忍开始抱怨,“天呐,这么多书到什么时候才能看完了”,“学软件开发,感觉上了贼船”。这时候,我的回答一般是,“别着急,什么时候带你们去看看我的书房,到现在每月花在技术书籍上的钱400元,这在软件开发人员之中还只能够算是中等的”,学生当场晕倒。(注:这一部分学生是刚学软件开发的)
对于在JAVA开发领域的好书在笔者另外一篇文章中会专门点评。该文章可作为本文的姊妹篇。
1.9 使用合适的工具
工欲善其事必先利其器。软件开发包含各种各样的活动,需求收集分析、建立用例模型、建立分析设计模型、编程实现、调试程序、自动化测试、持续集成等等,没有工具帮忙可以说是寸步难行。工具可以提高开发效率,使软件的质量更高BUG更少。组合称手的武器。到飞花摘叶皆可伤人的境界就很高了,无招胜有招,手中无剑心中有剑这样的境界几乎不可企及。在笔者另外一篇文章中会专门阐述如何选择合适的工具(该文章也可作为本文的姊妹篇)。
2.软件开发学习路线
两千多年的儒家思想孔孟之道,中庸的思想透入骨髓,既不冒进也不保守并非中庸之道,而是找寻学习软件开发的正确路线与规律。
从软件开发人员的生涯规划来讲,我们可以大致分为三个阶段,软件工程师→软件设计师→架构设计师或项目管理师。不想当元帅的士兵不是好士兵,不想当架构设计师或项目管理师的程序员也不是好的程序员。我们应该努力往上走。让我们先整理一下开发应用软件需要学习的主要技术。
A.基础理论知识,如操作系统、编译原理、数据结构与算法、计算机原理等,它们并非不重要。如不想成为计算机科学家的话,可以采取“用到的时候再来学”的原则。
B.一门编程语言,现在基本上都是面向对象的语言,JAVA/C++/C#等等。如果做WEB开发的话还要学习HTML/JavaScript等等。
C.一种方法学或者说思想,现在基本都是面向对象思想(OOA/OOD/设计模式)。由此而衍生的基于组件开发CBD/面向方面编程AOP等等。
D.一种关系型数据库,ORACLE/SqlServer/DB2/MySQL等等
E.一种提高生产率的IDE集成开发环境JBuilder/Eclipse/VS.NET等。
F.一种UML建模工具,用ROSE/VISIO/钢笔进行建模。
G.一种软件过程,RUP/XP/CMM等等,通过软件过程来组织软件开发的众多活动,使开发流程专业化规范化。当然还有其他的一些软件工程知识。
H.项目管理、体系结构、框架知识。
正确的路线应该是:B→C→E→F→G→H。
还需要补充几点:
1).对于A与C要补充的是,我们应该在实践中逐步领悟编程理论与编程思想。新技术虽然不断涌现,更新速度令人眼花燎乱雾里看花;但万变不离其宗,编程理论与编程思想的变化却很慢。掌握了编程理论与编程思想你就会有拨云见日之感。面向对象的思想在目前来讲是相当关键的,是强势技术之一,在上面需要多投入时间,给你的回报也会让你惊喜。
2).对于数据库来说是独立学习的,这个时机就由你来决定吧。
3).编程语言作为学习软件开发的主线,而其余的作为辅线。
4).软件工程师着重于B、C、E、D;软件设计师着重于B、C、E、D、F;架构设计师着重于C、F、H。
3.如何学习JAVA?
3.1 JAVA学习路线
3.1.1 基础语法及JAVA原理
基础语法和JAVA原理是地基,地基不牢靠,犹如沙地上建摩天大厦,是相当危险的。学习JAVA也是如此,必须要有扎实的基础,你才能在J2EE、J2ME领域游刃有余。参加SCJP(SUN公司认证的JAVA程序员)考试不失为一个好方法,原因之一是为了对得起你交的1200大洋考试费,你会更努力学习,原因之二是SCJP考试能够让你把基础打得很牢靠,它要求你跟JDK一样熟悉JAVA基础知识;但是你千万不要认为考过了SCJP就有多了不起,就能够获得软件公司的青睐,就能够获取高薪,这样的想法也是很危险的。获得“真正”的SCJP只能证明你的基础还过得去,但离实际开发还有很长的一段路要走。
3.1.2 OO思想的领悟
掌握了基础语法和JAVA程序运行原理后,我们就可以用JAVA语言实现面向对象的思想了。面向对象,是一种方法学;是独立于语言之外的编程思想;是CBD基于组件开发的基础;属于强势技术之一。当以后因工作需要转到别的面向对象语言的时候,你会感到特别的熟悉亲切,学起来像喝凉水这么简单。
使用面向对象的思想进行开发的基本过程是:
●调查收集需求。
●建立用例模型。
●从用例模型中识别分析类及类与类之间的静态动态关系,从而建立分析模型。
●细化分析模型到设计模型。
●用具体的技术去实现。
●测试、部署、总结。
3.1.3 基本API的学习
进行软件开发的时候,并不是什么功能都需要我们去实现,也就是经典名言所说的“不需要重新发明轮子”。我们可以利用现成的类、组件、框架来搭建我们的应用,如SUN公司编写好了众多类实现一些底层功能,以及我们下载过来的JAR文件中包含的类,我们可以调用类中的方法来完成某些功能或继承它。
那么究竟应该选择什么方向呢?
我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧。
每个培训机构都会宣传自己的好处,并不能说明大的趋势。一些新闻文章很有可能是枪手写的,不必太过相信。国外背景的教师和课程,未必适合你。
那么怎么才能确定自己将来的方向?如何才能从纷繁复杂、或真或假的数据世界中挖出一条路?
我讲一个通过招聘网站的观察方法。
可以到各种招聘的网站上查询信息(可以到google上查询招聘的网站),例如: http:// 得到别人的回答,要懂得感恩。
第四篇:Java心得
JAVA心得
1.Only public & abstract are permitted for interface.2.Only public, abstract & final are permitted for class.3.main方法作为程序的入口,其modifier必须是 public static void
且必须有一个类型为String的数组参数, 否则不能运行.4.非static内部类中不能有static的域和方法.static的域和方法只能存在于顶级类中或者是static嵌套类中.5.interface 中定义的变量都是public static final的, 且必须赋值.6.如果试图在方法中更改final变量的值, 则编译不能通过;
7.两个int类型的数相除其结果也是int型且不会四舍五入而是直接截取整数部分.一个浮点型数字与整数相除其结果是浮点型.8.try{}块后面必须有catch(Exception){}或者finally{}
try{return a;}
finally{
}
执行顺序是return语句返回结果之前 先执行finally{}再返回结果.9.子类override父类方法是可见修饰符级别不能降低,例如父类是protected
子类可以是protected和public 但不可以是default和private.如果子类有个方法与父类同名且参数类型也相同,则必须返回值类型也相同 否则不能编译.Java允许方法名与类名相同, IDE会给出警告但可以编译和运行.
第五篇:Java语言-自学手册完全版
北京广播电视大学 Java语言自主学习手册
理工教学部 2010.10
Java的发展史1991.4—Sun进军消费电子产品市场, 成立Green小组,开发Oak语言1992.10—成立First Person公司,将Oak应用于Web,改名为Java1993~4 —Web技术在Internet上流行1995.5—Sun正式发表Java与HotJava产品1995.10 ——与Netscape合作1995.12 ——微软支持Java1996.2 ——Java 1.0正式出品2000.9 ——升级至Java 1.32001.7 ——升级至Java 1.41第1讲概述2
Java 2 PlatformJava 2 Enterprise Edition(J2EE)包含开发基于Web的应用程序类与接口,包含servlet、JavaServerPages和Enterprise JavaBeans类等等Java体系结构应用程序Java编程语言Java类文件Java 2PlatformJava 2 Standard Edition(J2SE)包含Java类和GUI类Java运行时环境Java APIJava虚拟机Java 2 Micro Edition(J2ME)Java对电子设备提供优化的运行时环境3操作系统(Windows、Unix等等)4
Java运行环境Java运行时环境(JRE,Java Runtime Environment)是Java虚拟机与核心类的组合,即Java平台Java运行环境的主要功能:–加载代码:将字节码转化为本机代码,进行类的装载和符号引用的消解,由类装载器完成–校验代码:由字节码校验器完成–执行代码:控制代码的执行,由运行时解释器完成5•Java类库API类库APIJava API是SUN提供的用Java语言开发的集合Java应用程序编程接口(API,Application Program Interface)是预先编好的代码,组成类似主题的包Java API包括几十个包,常用的有:java.lang,java.io, java.util, java.net, java.awt, java.applet等6
Java 核心类包举例1.java.lang----包含一些Java语言的核心类2.java.awt----包含了构成抽象窗口工具集(AWT)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)3.java.applet----包含applet运行所需的一些类4.java.net----包含执行与网络相关的操作的类5.java.io----包含能提供多种输入/输出功能的类6.java.util----包含一些实用工具类7Java的语法机制Java是面向对象程序设计语言。面向对象的编程思想力图使对计算机语言中对事物的的描述与现实世界中该事物的本来面目尽可能的一致面向对象程序设计是使用类和对象将现实世界中真实的或抽象的实体在程序中建立模型8 1 / 50
Java的语法机制类(class)和对象(object)是面向对象方法的核心概念。类是对一类事物描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)类(class)最重要、最基本的语法设施,类的定义与继承与C++类似,主要区别:•Java不允许多重继承,多重继承必须通过接口实现•Java引进了abstract 和final修饰词9直译式语言Java与C++比较JavaC++编译后产生机器码跨平台运行速度具有指针类型继承10
接口(interface)•是一种抽象类,其中只能出现静态常量或抽象方法定义•主要目的是实现多重继承功能,避免C++在多重继承语义上的复杂性•一个Java类可以实现(继承)多个接口程序包(package)•是一些相关类或接口的集合•Java提供包括可重用类标准程序包,用户可自定义程序包•通过import 语句将程序包引入应用程序11自动内存回收•Java取消了指针类型,所有动态内存请求均通过new运算符,并且得到的不是指针而是引用•系统自动进行内存回收多线程•语言级支持多线程,忽略操作系统多线程机制的差异,软件具有更好的可靠性和可移植性12
Java的特性Sun公司的Java语言白皮书中指出Java的特性1.2.3.4.5.6.简单性面向对象分布式特征健壮性直译性结构中立性7.可移植性8.安全性9.多线程10.高性能11.动态特征Java三种核心机制Java 虚拟机(Java Virtual Machine)垃圾收集机制(Garbage collection)代码安全性检测(Code Security)1314
Java虚拟机(Java Virtual Machine)在一台计算机上由软件或硬件模拟的计算机Java虚拟机(JVM)读取并处理经编译过的平台无关的字节码class文件Java编译器针对Java虚拟机产生_______文件,因此是独立于平台的Java_________负责将Java虚拟机的代码在特定的平台上运行15Java虚拟机(JVM)Java虚拟机规范定义了:–指令集–寄存器集:程序计数器、栈顶指针等–类文件结构–堆栈:提供各种参数等–垃圾收集堆–内存区域:存放字节码的方法代码、符号表16 2 / 50
Java自动垃圾收集技术(garbage collection)不再使用的内存空间应回收在C/C++等语言中,由负责回收无用内存垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和干预Java语言解除了程序员回收无用内存空间的责任。它提供一种系统级线程跟踪存储空间的分配情况。并在JVM的空闲时,检查并释放那些可被释放的存储器空间17Java代码安全性检测•三级代码安全检查–验证:在类下载时完成,检查从哪里下载文件,是否有权限进到本机系统–字节码校验:分析下载的字节码是否合乎规则–跟踪监测:执行时安全管理器始终监测所执行的每步操作,检查其合法性18
Java运行环境安装及配置Java开发工具集JDK(Java Development Kits)–Java编译器–Java运行时解释器–Java应用程序编程接口–Java文档化化工具–其它工具及资源19设置环境变量•Path 外部命令搜索路径•CLASSPATH类资源位置搜索路径20
安装后的目录结构21Java 程序分类•Java Application以main()方法作为程序入口,由Java解释器加载执行•Java Applet没有main()方法作为程序入口,可由浏览器加载执行22
简单Java应用程序(Application)举例源文件:HelloWorld.javapublic class HelloWorld{ public static void main(Stringargs[]){System.out.println(“HelloWorld!”);}}23Application应用程序分析•类定义(class)Java程序的基本组成部分是类public class HelloWorld•主方法Java Application程序的入口是方法固定的书写格式:public static void main(Stringargs[]){……}24 / 50
Application应用程序分析•源文件–Java程序的源文件扩展名必须是―‖–Java程序的源文件名必须与main()方法所在相同–Java源文件中包含多个类•程序内容–由方法体实现程序要完成的功能,方法的实现由一个个语句组成–语句以―‖作为结束标志25–大小写Application应用程序分析•命名–如果.java 文件包含一个public 类,它必需按命名–如果一个类中含有main()方法,它必需按命名–文件名、类名大小写•类个数–一个源文件中有多个类,但只能有一个类其它类的个数不限26
Java编译器•javac.exe将.java文件编译成.class字节码文件格式javac<参数> <.java源文件名>-d <路径> 指定存放所产生类文件路径27Java解释器•java.exe解释执行.class字节码文件格式java <.class文件> [实参表]java-jar <.jar文件> [实参表]28
Java Application 的运行•javacHelloWorld.java功能:源文件名为HelloWorld.java,由javac编译器编译源程序,产生字节码文件(.class文件)•java HelloWorld功能:字节码文件由java解释器解释执行29Java Applet•Applet就是使用Java语言编写的在环境中运行•Applet类存于类的子类•它与Application的区别主要在于其不同•Application是从其中的方法开始运行的•Applet是在中运行的,必须创建一个文件,通过编写HTML语言代码告诉浏览器载入何种Applet以及如何运行30的包中,是,它可以
Java Applet
简单Java应用程序(Applet)举例编译源文件:javacHelloWorld.java产生字节代码:HelloWorld.classApplet 举例•创建一个HTML文件:hello.html3334
Java数据类型划分第2讲Java语言基础数据类型整数类型数值型(byte,short,int,long)浮点类型(float,double)基本数据类型字符型(char)逻辑(布尔)型(boolean)类(class)引用数据类型接口(interface)数组复合类型3536
逻辑型•boolean类型适于逻辑(布尔型)运算,一般用于。•boolean类型数据只允许取值true或false,不可以替代字符型•char型数据用来表示通常意义上―字符‖•字符常量是用单引号括起来的单个字符•Java字符采用占字节,因而可用编码形式表示,每个字符进制•Java语言中还允许使用转义字符''来将其后的字符转变为其它的含义3738
整数类型Java各整数类型有固定的表数范围和字段长度,而不受具体操作系统的影响,以保证Java程序的可移植性类型占用存储空间1字节2字节4字节8字节表数范围-128 ~ 127-215 ~ 215-1-231 ~ 231-1-263 ~ 263-1 39整数类型•整型常量的三种表示形式–十进制整数(如12,-345, 0)–八进制整数,要求以0开头(如012,0345)–十六进制数,要求0x或0X开头(如0x12,0X345)byteshortintlong•Java的整型常量默认为int型•声明long型常量可以后加‗l ‘或‗L ‘40 / 50
浮点型Java浮点类型有固定的表数范围和字段长度类型floatdouble占用存储空间4字节8字节表数范围-3.403E38~3.403E38-1.798E308~1.798E308 浮点型•Java浮点类型常量有两种表示形式–十进制数形式,必须含有小数点–科学记数法形式•Java浮点型常量默认为double型,如要声明一个常量为float型,则需在数字后面加f或F4142 Java引用类型•Java语言中除8种基本数据类型以外的数据类型称为引用类型•引用类型数据以的形式存在•引用类型变量的值是某个对象的存储地址,而不是对象本身•声明引用类型变量时,系统只为该变量分配,并未创建。43引用类型应用举例public class MyDate{private intday = 1;private intmonth = 1;private intyear = 2000;public MyDate(intd, intm, inty){year = y;month = m;day = d;} public void display(){System.out.println(year+ “ / ” + month + “ / ” +day);}public static void main(String[] args){MyDatem;m = new MyDate(1, 8, 2003);} }44
对象的构造和初始化对象的构造和初始化1.为引用类型变量分配引用空间MyDatem;m2.创建新对象①②4546
分配内存:new MyDate(1, 8, 2003);daymmonthyeardaymonthyeardaymonthyear473.调用所属类的构造方法new Mydate(1, 8, 2003);public Mydate(inty, intm, intd){year = y;month = m;day = d;} mdaymonthyear默认初始化:m显示初始化:m48 / 50
4.为引用类型变量m赋值m = new MyDate(1, 8, 2003);0x11111111默认初始化原则成员变量类型byteshortintlongcharfloatdoubleboolean所有引用类型49mdaymonthyear取值0 000L'u0000' 0.0F 0.0D false null 50
常量•常量一经建立在程序运行的整个过程中都不会改变•final标记的变量(成员变量或局部变量)即称为常量•常量只能赋值一次,一般大写•字符常量用引起来表示单个字符•字符串常量用引起来表示一串字符51Java变量•变量用于的数据•按所属的数据类型划分基本数据类型变量引用数据类型变量•按被声明的位置划分局部变量定义的变量成员变量定义的变量52
局部变量声明和初始化•Java变量使用前必须先声明和初始化(赋初值)•局部变量声明语法格式DataTypevarName1[=value1][,varName2[=value2]…] 成员变量声明和初始化•成员变量在中声明•在同时创建有关的成员变量•成员变量创建后系统自动对其进行–初始化–初始化5354
变量作用域•局部变量的作用域就是它所在的方法或语句块•在时,局部变量才被创建并,随方法(语句块)的,局部变量将被销毁•成员变量依附于具有与作用域55标识符•Java语言中,为各种变量、常量、方法、对象和类等起的名字称为标识符•Java标识符的命名规则–以字母、下划线、美元符开头–后跟字母、下划线、美元符或数字•Java标识符大小写敏感,长度无限制•标识符在命名时,应在一定程度上反映所表示的变量、常量、方法、对象和类的意义56存在,相同的生存期和 / 50
Java 编码惯例••••••包名类名接口名方法名变量名常量名package date.newdateclass IOExceptioninterface RunnableaMethod()aNewWordPIMAX_SIZE57关键字•关键字(keyword):Java中一些赋以特定的含义、并用做专门用途的单词•所有Java关键字都是的,true、false、null等都不是Java关键字•goto和const 虽然从未使用,但也作被为Java关键字保留58
Java 分隔符作用•Java语句必须以分号作为结束标记•Java语句中逗号分隔方法的参数和变量的说明•Java语句中冒号说明语句标号•Java允许用花括号―{}‖将一组语句括起来,形成一个语句块(block)•Java程序源代码中各组成部分之间可以插入任意数量的空格,包括换行59Java 分隔符Java语句块(block)用法–定义类时类体必须采用语句块形式–定义方法时方法体必须采用语句块的形式–定义循环语句时,循环体可以语句块的形式,采用将0~多条语句集合到一起,作为一个整体进行处理–语句块可以嵌套,嵌套层数无限制60
Java运算符与表达式与C不同之处:•Java是强类型语言,类型限制比C严格,运算符的操作对象的类型会受到更多限制•Java不提供指针运算符,增加了对象操作符instanceof,字符串运算符+和零填充的右移>>>等61算术运算符算术运算符功能+ 加-减* 乘/ 除% 取余++ 前(/后)加1--前(/后)减162
逻辑运算符逻辑运算符!逻辑非& 逻辑与| 逻辑或^ 逻辑异或&& 短路与|| 短路或6364短路逻辑运算符&& 第一个操作数为假则不判断第二个操作数|| 第一个操作数为真则不判断第二个操作数 8 / 50
移位运算符位运算符位运算符功能~--取反&--按位与|--按位或^--按位异或65左移–―a<>b;‖将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位无符号右移–―a>>>b;‖将二进制形式的a逐位右移b位,最高位空出的b位补066
运算符•赋值运算符: = •扩展赋值运算符:+=,―=,*=,/=,/=,%=,&=,|=,^=,<<=,>>=,>>>=•字符串连接运算符: + •其它运算符:?:,[],.,(),(type),new,instanceof(对象操作符)67扩展赋值运算符运算符+=-=*=/=%=&=|=^=<<=>>=>>>=用法举例a += ba-= ba *= ba /= ba %= ba &= ba |= ba ^= ba <<= ba >>= ba >>>= b等效的表达式a = a+ba = a-ba = a*ba = a/ba = a%ba = a&ba = a|ba = a^ba = a<
字符串连接运算符•―+‖除用于算术加法运算外,还可用于对字符串进行连接操作inti = 300 +7;String s = ―hello, ‖+ ―world!‖•―+‖运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接inti = 300 +7;String s = ―hello, ‖+ i + ―号‖;System.out.println(s);//输出:hello, 307号69其它运算符操作符?:[][][].()(type)new格式op1 ? op2 : op3描述如op1 是true, 返回op2,否则返op3数组声明s创建op1 个元素的数组访问op1数组的索引为op2 的元素引用op1对象的成员op2方法调用强制类型转换创建对象或数组70type []type[ op1 ]op1[ op2 ]op1.op2op1(params)(type)op1new op1instanceofop1 instanceofop2如果op1 是op2的实例,则返回true
强制类型转换•强制类型转换形式:(type)表达式例:intx=15;float f =(float)x/2;•Java对于数据类型所占用空间大小有严格规定,因此在进行数据类型转换时可能因为内存空间的改变而影响变量值•转换时,尽量由所占内存空间小的转换成内存空间大的71强制类型转换对强制类型转换的限制:•整型与浮点型相互转换•基本类型和数组、对象等复合类型之间互相转换72 / 50
表达式•表达式是符合一定语法规则的运算符和操作数的序列•表达式的类型和值–对表达式中操作数进行运算得到的结果称为表达式的值–表达式的值的数据类型即为表达式的类型•表达式的运算顺序–首先应按照运算符的优先级从高到低的顺序进行–优先级相同的运算符按照事先约定的结合方向进行73数组•数组是多个相同类型数据的有序的组合,实现对这些数据的统一管理•数组属引用数据类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量•数组中的元素可以是任何数据类型,包括基本类型和引用类型•数组要经过声明(定义)、分配存储空间、赋值后才能被使用74
数组的特征1.数组中每个元素的数据类型都是相同的2.数组中的各个元素是有顺序的3.所有元素公用一个数组名4.数组名和数组下标唯一确定数组中每个元素的位置75一维数组声明一维数组的声明方式:type var[];或type[] var;例如:inta[];int[] b;double d[];MyDate[] md;Java语言中声明数组时不能指定其长度(数组中元素的个数)76
数组初始化静态初始化:在定义数组的同时就为数组元素分配空间并赋值动态初始化:数组定义与为数组元素分配空间并赋值的操作分开进行77数组元素的默认初始化数组是类型,它的元素相当于,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。78
数组元素的引用•定义并用运算符new为之分配空间后,才可以引用数组中的每个元素•数组元素的引用方式arrayName[index]a[0]a[1]a[2]多维数组inta[][] = {{1,2},{3,4,5,6},{7,8,9}};12a[0][0]a[0][1]345789a[2][0]a[2][1]a[2][2]80a[1][0]a[1][1]a[1][2]a[1][3]–index为数组元素下标,可以是整型常量或整型表达式,如a[3],b[i],c[6*i]–数组元素下标从开始。79a6–长度为n的数组合法下标取值范围是•每个数组都有一个length属性表示数组的长度 / 50
多维数组•Java中多维数组被做为数组的数组处理•Java中多维数组的声明和初始化应按从高维到低维的顺序进行•Java中多维数组不必须是规则矩阵形式inttwoDim[][] = new int[4][];twoDim[0] = new int[5];twoDim[1] = new int[5];inttwoDim[][] = new int[][4];8182inttwoDim[][] = new int[4][5];tweDim[0][1][2][3]
复制数组java.lang.System类的arraycopy()方法提供了数组元素复制功能•源数组intsour [ ] = { 11, 12, 13, 14, 15,16 };•目的数组intdest[ ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };•复制源数组中的所有元素到目的数组,从下标0的位置开始存储System.arraycopy(sour,0,dest,2,sour.length);83第3讲Java语言的结构化程序设计84
Java程序结构import java.applet.Applet;import java.awt.*;public class GetSextends Applet{Label label;Java包引入语句类声明语句成员变量Init方法paint方法Java程序结构•Java源程序是由类定义组成的,每个程序可以定义若干个类,但是只有一个类是主类–Java Application:包含main方法的类–Java Applet:Applet类的子类public void init(){label1=new Label(“前30个数的平方”);add(label1);}}public void paint(Graphicsg){for(inti=0;i<30;i++){intx=i%10, y=i/10;循g.drawString(String.valueOf((i+1)*(i+1)),环20+30*x,50+25*y);}}类体8586
Java程序结构Java程序中定义类使用关键字class,每个类定义由类头定义和类体定义两部分组成–类头部分用来声明类名和说明类的继承特性–类体部分用来定义静态属性和方法87语句•表达式语句(expression statements)•声明语句(declaration statement)•程序流控制语句(control flow statement)88 / 50
表达式语句将表达式后缀以―;‖,构成表达式语句•赋值语句•增量语句(使用++ 或--)•方法调用语句•对象创建语句aValue= 8933.234;//赋值语句aValue++;//增量语句System.out.println(aValue);//方法调用语句integerObject= new Integer(4);//对象创建语句89语句块•由―{ }‖括起来的0个或多个语句组成•可以出现在任何单个语句可以出现的位置•在流程控制语句中,即使只有一条语句也最好使用语句块90 程序流程控制•if …else •switch •for•while•do …while分支语句分支语句实现程序流程控制的功能,即根据一定的条件有选择地执行或跳过特定的语句Java分支语句分类–if-else 语句–switch 语句9192
if-else语句语法格式if(boolean类型表达式){语句或语句块;}if(boolean类型表达式){语句或语句块;} else if(boolean类型表达式){语句或语句块;} else {语句或语句块;}switch语句语法格式switch(exp){case const1:statement1;break;case const2:statement2;break;……case constN:statementN;break;[default:statement_dafault;break;]} 9394
循环语句功能–在循环条件满足的情况下,反复执行特定代码循环语句分类–for 循环–while 循环–do/while 循环循环语句的四个组成部分–初始化部分(init_statement)–循环条件部分(test_exp)–循环体部分(body_statement)–迭代部分(alter_statement)95循环语句for 循环语句语法格式for(init_statement;test_exp;alter_statement){body_statement}96 / 50
while/do while 循环语句语法格式while循环:[init_statement]while(test_exp){body_statement;[alter_statement;]}特殊流程控制语句break 语句–break语句用于终止某个语句块的执行{ ……break;……}do while循环:[init_statement]do{body_statement;[alter_statement;]}while(test_exp);–break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块9798
特殊流程控制语句continue 语句–continue语句用于跳过某个循环语句块的一次执行–continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环99第4讲面向对象软件开发基础100
对象•对象是面向对象技术的核心所在,以面向对象观点看来,所有面向对象的程序都是由对象来组成的•面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现101类•类是面向对象技术中一个非常重要的概念。简单的说,类是同种对象的集合和抽象102
面向对象技术的设计思想•传统程序设计思想:–把现实世界中的问题抽象成计算机可以理解和处理的数据结构,即让现实世界向计算机世界靠拢对象的状态•对象的状态又称为对象的属性,主要指对象内部所包含的各种信息即变量•一个对象的状态是它反映于现实世界的一系列属性–参数的数值(与对象有关系的数据)–与其它对象的关系–任一时刻的历史状态104•面向对象技术关键设计思想:–让计算机逻辑来模拟现实世界的物理存在,即让计算机世界向现实世界靠拢103 / 50
对象的行为•对象的行为又称为对象的操作,主要表述对象的动态属性,操作的作用是设置或改变对象的状态•对象的操作一般是基于对象的属性,并意图改变这些属性•对象的状态也会影响对象的行为•定义当其它对象发出请求时,该对象如何反应•由为对象定义的一系列操作决定105对象的标识•用程序中的对象名表示•每一个对象都有一个唯一的标识, 即使其状态有可能与其它对象一样106
对象的属性•状态→属性→变量•行为→操作→方法•标志→标识→对象名••••面向对象软件开发面向对象的分析阶段面向对象的设计阶段实现阶段维护阶段107108
面向对象程序设计方法的特点••••抽象封装多态继承抽象•科学研究的方法,去掉被研究对象中与主旨无关的次要的部分,或暂时不考虑的部分,仅仅抽取出与研究工作有关的实质性的内容加以考虑–过程抽象–数据抽象109110
封装抽象数据类型•在面向对象语言中,在数据类型的声明与操作这些数据的代码声明之间建立紧密联系,这种联系通常描述为一种抽象数据类型•Java用类来实现抽象数据类型的概念•利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其它部分只有通过包裹在数据外部被授权的操作,才能与这个抽象数据类型交流和交互•在Java中抽象数据类型用―类‖这种面向对象工具可理解和操纵的结构来代表,每个类都封装了相关的数据和操作•保证数据的完整性和安全性•使用抽象数据类型提高可重用性111112 / 50
继承•存在于面向对象程序的两个类之间的一种关系,当一个类拥有另一个类的所有数据和操作时,就称这两个类之间具有继承关系•被继承的类称为父类和超类•继承的类称为子类•一个父类可以同时拥有多个子类•每个子类都唯一拥有一个直接父类113面向对象概念•对象和类–类把数据和对数据的操作封装在一起–对象是类的实例,实际操作的是对象•对象的描述–静态结构(自身)共同构成–组织结构(空间位置)对对象的–生存状态(时间位置)全息描述114
•利用继承,提高代码质量,灵活性•类库管理的代价•领域分析的代价•学习的代价•利用封装,提高代码的安全性•管理的代价•利用多态,提高代码的可读性和设计灵活性116面向对象思想的本质••••模拟现实,对现实系统的直接模拟越完善的模拟,越接近实际模拟建立在分析的基础上模拟建立在层次的基础上,可以层层递进•通过正常和异常处理机制,完成处理流程面向对象的机制115
类的概念第5讲Java面向对象编程基础•类是现实世界中实体的,是封装了的复杂的抽象数据类型,类具有完整的和相对的,可以包含丰富的内涵、更好的安全性和更大的功能•定义类的过程就是定义类的的过程–类的属性就是类的静态属性的简称–类的服务则被称为成员函数或方法•类包括生命周期中的要用到的所有代码,构造方法、变量和方法的声明等•类中直接声明的变量(属性)称为变量,118方法称为方法117
类的语法结构[修饰符] class 类名[extends 父类] [implements 接口名]{类成员变量声明;类构造方法声明;类方法声明;}例:class TestClass{String name;intage;String department;public TestClass(){ }void print(){System.out.println(name+“is”+ age +“at”+department);} 119}声明类头•父类名•接口名•修饰符–访问控制符–抽象类说明符–最终类说明符120 / 50
声明类体类的属性–基本数据类型[修饰符] 变量类型变量名[=变量初值];–引用数据类型[修饰符] 类名对象名[=new 类名(实参表)];•属性是类的特征或特性•属性的值是某一特定对象的属性值•在类中属性名必须是唯一的•每一个类的实例都存有为这个类定义的所有属性的值121对象生命周期•_________对象•_________对象•______________对象122
创建对象创建对象的三个步骤•••Employee e = newEmployee(“LiSi”,40,“Java Department”);123对象的回收•垃圾收集机制(garbage collection):Java运行环境当确定某个对象不再被使用时,将其。一个对象在没有指向它时,可作为垃圾收集•垃圾搜集器:Java运行环境中的垃圾搜集器地释放不用对象占用的空间124
声明类体•类的方法–称为成员方法,用来规定操作,实现机制,是类与外界进行的窗口[修饰符] 返回值类型方法名(参数列表)throws 例外名表{关键字static•static称为修饰符时,•在Java类中声明可使用关键字static做为修饰符方法体} •类的方法作用–围绕着类的属性进行各种操作–与其他的类或对象进行数据交流、信息传递等操作125•static标记的属性或方法由共享,如访问控制权限允许,可不必创建该类的而直接用调用•static成员也称类成员或静态成员,如:类属性、静态属性、类方法、静态方法等126
类属性•被static 修饰的属性称为静态属性或类属性•类属性是类的属性,任何一个类的具体对象,即对于该类的任何一个具体对象而言,类属性是一个,任何一个对象访问或修改它,都是针对同一。•类属性由该类的所有共享127类属性•类属性在加载该类时,只分配一次并。•类属性可以由或,修饰•对于修饰的类属性,可以在类外直接用类名调用而不需要初始化128 / 50
类方法•在方法前加入static标识符,即为类方法•类方法是属于•类方法可以在不产生以来调用的方法的情况下直接类方法•在类方法内部不能对方法进行访问•在类方法内部不能使用•this表示调用关键字的对象,而类方法变量和•非static 的方法是属于某个对象的方法,在这个对象时对象的方法在内存中拥有的代码段•static 方法只能处理的成员属性129不需要利用对象进行调用130
静态初始化器•由关键字static引导的语句块(语句组)•存在类的中、的外部静态初始化器与构造方法•构造方法是始化,静态初始化器对始化初初•static块通常用于初始化static(类)属性•static语句块仅在其所属的类被载入时执行一次131•构造方法在时由系统自动执行,静态初始化器是在其时由系统调用运行•静态初始化器方法132
抽象类关键字abstract•abstract 是修饰符类方法•含有抽象方法的类必须被声明为_______,并在类定义关键字class前加入_________修饰符。•抽象类必须_________,抽象方法必须_____________。•抽象类不能被实例化,一般可以利用其_________类的实例进行实例化操作。abstractclass Employee{abstractvoid raiseSalary(inti);}133134•加入abstract的类称为•加入abstract的方法称为
抽象方法•一个方法只有部分而没有方法的,该方法叫做抽象方法•抽象方法必须用•抽象方法必须以束标志来修饰作为结•final是•final可以修饰关键字final修饰符;;类;方法;•final修饰的类称为•final修饰的方法称为abstractclass Employee{abstractvoid raiseSalary(inti);}class Manager extendsEmployee{void raiseSalary(inti){ ….}} •final修饰的变量(成员变量和局部变量)称为;•final标记的类不能被135。136•final标记的方法不能被 / 50
终结器关键字final•final标记的成员变量必须在或在中显式赋值,然后才能使用•常量只能赋值,一般写•在面向对象程序设计中,对象与单纯的变量一样,有其产生和消亡的过程,当一个对象不再有用时应该回收它(释放其所占用及其他)•终结器是的方法•终结器无参数列表和返回值•由系统自动调用•终结器的调用时刻取决于系统的垃圾回收线程protected void finalize(){System.out.println(toString());}137138final intPI = 3.1415927;•被定义成final的类不能有类
访问控制修饰符在对Java类中定义的属性和方法进行访问时,可以通过不同的访问控制修饰符规定不同的访问等级Modiferprivatedefaultprotectedpublic同一类同一个包YesYesYesYesYesYesYesYesYesYes139140关键字volatile•关键字volatile修饰的属性可以同时被几个线程所控制和修改•关键字volatile用来修饰接受外部输入的属性子类其它
关键字native•关键字native用来声明用其他语言书写方法体并具体实现方法功能的特殊方法native double addMethod(intx,inty);关键字synchronized•用于多线程共存的程序中的协调和同步•修饰类方法,调用前将当前类的对象加锁•修饰普通方法,调用前将调用方法的对象加锁142141
修饰符的混合使用•abstact不能与final并列修饰同一个类•abstact不能与private、static、native或final并列修饰同一个方法•abstact类中不能有private的成员(包括属性和方法)•abstact方法必须在abstact类中•static方法中不能处理非static的属性143第6讲深入面向对象程序设计144 / 50
类的继承类是所有Java类的最高层父类。继承,不允许类。类。,达145类的继承子类继承父类的属性、方法子类中只需声明的东西父类中带private 修饰符的属性、方法被继承,子类从父类继承所有属性和方法作为自己的成员构造方法被继承146Java只支持一个一个继承。类只能有一个类可以继承出多个一个类通过实现到多继承效果。
类的继承在方法中调用构造方法用调用父类的构造方法用;;关键字this•Java中为解决变量的命名冲突和不确定性问题,引入关键字―this‖•this代表this在构造方法中指this在普通方法中指Java中任何一个类的实例都可作为类的实例使用,可调用类具有的方法Employee [ ] e= new Employee[200];e[0] = new Manager();e[1] = new Worker();e[2] = new Employee();•―this.属性‖和―this.方法‖表示调用147•―this()‖表示调用148
属性的继承•子类可以继承父类属性,而这些属性是所有子类都拥有的属性的集合Employee+name : String +salary : double+birthDate: Date+getDetails(): StringManager+department : StringEngineer+project : String属性的隐藏•属性隐藏:•子类Child继承父类Parent中非私有属性变量,且子类定义了与父类同名的属性变量,子类中拥有两个同名的变量,即出现了子类变量对父类同名变量的隐藏•当子类执行理来自父类的变量149的方法时,处的方法时,处150•当子类执行理自己定义的变量
方法的重写(覆盖)方法的继承•子类可以继承父类的非私有的方法Employee+name : String +salary : double+birthDate: Date+getName(): StringManager+department : String+getDepartment():StringEngineer+project : String+getProject():String151•概念:•重写的方法在调用时,使用类名或所属类的对象名•重写方法必须和被重写方法具有相同的、列表和类型•重写方法不能使用比被重写方法更严格的,即方法的不能缩小•不能抛出新的例外152 / 50
方法重写与属性隐藏子类变量隐藏父类的属性变量–子类继承的同名属性在子类对象中仍然存在,并占用独立的内存空间–子类对象直接调用的是子类中自定义的同名属性子类方法对父类方法的重写–清除父类方法占用内存空间153方法的重载在同一个类中一个方法名被用来定义多个方法•参数列表•返回类型•修饰符154
指代关键字•Java系统默认,每个类都缺省地具有null、this和super三个量,可以直接引用–null:–this:–super:155this关键字•this表示的是,即this代表一个引用•利用this可以访问、修改的属性、调用的方法156
this关键字•调用当前对象所属类的属性和方法this.属性名this.方法名•调用当前对象所属类的构造方法this(参数列表)157super 关键字•super表示的是当前对象的直接父类对象,是当前对象的直接父类对象的引用•super可用于访问的属性•super可用于调用的成员方法•super可用于在构造方法中调用的构造方法•super的追溯不仅于直接父类158
super关键字•调用父类对象的属性和方法super.属性名super.方法名•调用父类对象的构造方法super(参数列表)159构造方法•用于在创建所属类的对象时,由系统自动调用该类的构造方法为新对象初始化•构造方法无返回值•构造方法名与类名相同160 / 50
构造方法重载构造方法重载,参数列表必须。可以在构造方法的行使用this关键字调用其它(重载)的构造方法调用父类构造方法在子类的构造方法中调用父类的构造方法可使用语句如果子类的构造方法中没有地调用父类构造方法,也没有使用关键字调用重载的其它构造方法,则系统默认调用父类的构造方法如果子类构造方法中既未父类构造方法,而父类中又没有构造方法,则编译出错161调用的162
构造方法的继承子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法在一个Java类中可以通过两种方式获得构造方法1.使用系统默认的无参构造方法2.显式定义一个或多个构造方法163构造方法的继承如果子类没有自定义构造方法,则继承父类的构造方法如果子类自定义了构造方法,创建新对象时,先执行构造方法,再执行构造方法对于父类中有参数的构造方法,子类可以在自己的构造方法中利用调用,该语句必须是构造方法的可执行语句164
对象构造和初始化细节1.绑定构造方法参数2.如有this()调用,则调用相应的重载构造方法3.显式或隐式追溯调用父类的构造方法(Object类除外)4.进行实例变量的显式初始化操作5.执行当前构造方法的方法体165多态性在Java中,类的对象可以替代类的对象使用一个对象确定的数据类型一个引用类型变量指向(引用)类型的对象例如:Employee employee= new Manager();Object o = new Employee();o = new Manger();166
多态性多态的两种表现形式重载定义:一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量访问子类中添加的属性和方法重写定义:方法声明的参数类型为父类类型,可以使用作为实参调用该方法167168 / 50
父类对象和子类对象的转换•子类对象可以视为是其父类的一个对象•父类对象不能作为某个子类的对象•通过参数的传递可以将一个子类对象作为实参传递给父类对象的形参•父类的实例对象实际上是其某个子类实例对象时,可以通过强制类型转换将父类的实例对象恢复为子类实例对象强制类型转换对Java对象的强制类型转换称为造型–在造型前可以使用instanceof操作符测试一个对象的类型–从子类到父类的类型转换可以自动进行–从父类到子类的类型转换必须通过造型(强制类型转换)实现–无继承关系的引用类型间的转换是非法的170169
接口•定义:•接口是一种和方法的方法的类,其中只包含,而没有和。的,所。实•一个接口中所有成员方法都是有的成员变量都被定义为•接口类层次结构,不相关的类现相同的接口•接口是义的集合和的定171•多个无关的类•一个类•接口与实现类之间实现同一个接口实现多个无关的接口多态性172
接口的声明[public] interface 接口名[extends 父接口名列表]{ [public][static][final]属性类型常量名=常量值;[public][abstract]返回值方法名(参数列表)[throw 异常列表];}实现接口<访问控制> class 实现类[extends 父类名][implements 接口名[,接口名]*] {类体}173174
接口•可以通过实现接口实现多重继承:一个类可继承父类,并实现接口•一个接口可作为类名使用,实现多态•一个接口可以作为一种数据类型使用,实现多态接口用法总结通过接口可以实现通过接口可以指明通过接口可以了解175176 / 50
包•包(package)是集合,它提供与的一个管理创建包格式:package 包名用package语句指定源文件中的类属于一个特定包•包定义语句在每个源程序中即一个类包•包定义语句必须在程序的可有空格及注释)•包名用―‖分隔177178•Java平台中的类与接口都是根据功能以包组织的•包机制的好处:条,行(之前
创建包•在缺省情况下,系统会为.java源文件创建一个包,该.java源文件中定义的所有类都隶属于这个包,这些类之间相互引用,被其它包所引用package fly;public class Airplane extends Machine implements Fly{...}179包的引用•对于同一包中的其它类,需在要使用的属性和方法名前加上作为前缀•对于其它包中的类,则需要在类名前加上前缀•只有类型的成员才能被包外的类访问,访问要通过以下方法:•使用长名引用包成员•引入包成员•引入整个包180
•当要使用另一个包中的类,而该包并没有引入,则必须使用长名引用该类import 语句将package 引入源程序,格式:import 包名.*;import 包名.类名;[package …..][import ….][类声明…]...•import 语句必须在源程序前,在package 后•import 语句缺省是“import java.lang.*;”181182•可以先引入包中的指定类或整个包,再使用该类,这时可以使用短名
编程中的错误•错误是编程中不可避免和必须要处理的问题,编程人员和编程工具处理错误能力在很大程度上影响着编程工作的效率和质量•错误分为错误和错误183•编译错误是由于所编写的程序存在语法问题,未能通过从源代码到目标代码的编译过程而产生的,它是由语言的编译系统负责检测和报告•运行错误是在程序的运行过程中产生的错误。根据性质不同,可分为系统运行错误和逻辑运行错误。–系统运行错误:程序在执行过程中引发了操作系统的问题–逻辑运行错误:程序不能实现编程人员的设计意图和设计功能而产生的错误184 / 50
异常和异常类•异常又称为例外或违例,是特殊的运行错误对象,对应于Java语言特定的运行错误机制。一个异常就是其相对异常类的对象。Java中定义了很多异常类,每个异常类都代表了,类中包含了该等内容。185异常处理机制每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。186
异常的类型异常来表明出错的优点–将处理出错的代码与正常的代码分开–提供了一种针对特定错误作出强制响应的办法•异常总是类•所有的标准异常都由接子类涵盖,分别为包中的标准的一些子类对象类的两个直和类•这些类自身都有子类可以识别特定的异常情况188187
异常类的结构与组成ThrowableErrorAWTErrorLinkageErrorVirtualMachineError……ExceptionRuntimeExceptionClassNotFoundExceptionIOExceptionInterruptedException……189违例(Exception类)•Exception违例(例外)类,是Java异常类的父类,是其它因编程错误或偶然的外在因素导致的一般性问题•构造函数public Exception()public Exception(Strings)190
违例(Exception类)对于Exception类的子类表示的几乎所有异常,如果生成这些异常,在程序中必须处理它们,处理方法为:––191系统定义的运行异常Exception类有若干子类,每一个子类代表了一种特定的运行时错误。这些子类有些是系统事先定义好并包含在Java类库中的通常对应系统运行错误。由于这种错误可能导致操作系统错误甚至整个系统的瘫痪,所以需要定义异常类来特别处理192 / 50
异常处理异常类的结构与组成ExceptionRuntimeExceptionArithmeticExceptionIndexOutOfBoundsExceptionNullPointerException……IOExceptionUnknownHostExceptionMalformedURLExceptionSocketException……193•Java中的异常(exception)是当程序中出现不同寻常的情况时生成的一个对象•这种异常对象有相关的数据成员存储着故障的情况,一般称异常,也就是。•该异常对象可以作为,传递给专门为处理相关问题而编写的程序代码,接收异常对象作为的代码称为了异常•如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将,相应的Java194程序也将。
抛出异常•所有系统定义的运行异常都可以由系统自动抛出import java.io.*;public class ExceptionTest{public static void main(String[] args){String teachers[]={“liu”,“zhang”,“wang”};for(inti=0;i<5;i++){System.out.println(teachers[i]);}System.out.println(“nthisis the end”);}}195捕获违例•当一个异常被抛出时,应该有专门的语句来接收这个被抛出的异常对象,这个过程称为捕获违例或捕捉异常•当一个异常对象被捕获或接收后,用户程序就会发生流程的跳转,系统终止当前的流程而跳转至专门的异常处理语句块,或直接跳出当前程序和Java虚拟机回到操作系统196
捕获违例捕获异常是通过try-catch-finally语句实现try{......}catch(ExceptionName1 e){......}catch(ExceptionName2 e){......} [ finally{......} ]197捕获违例•getMessage()方法用来得到有关异常事件的信息•printStackTrace()方法用来跟踪异常事件发生时执行堆栈的内容198
捕获违例一个异常对象能否被一个catch语句块所接收,主要看该异常对象与catch块的异常参数的匹配情况:–异常对象与形参属于相同的异常类–异常对象属于形参异常类的子类–异常对象实现了形参所定义的接口199声明抛出违例•一个方法中的语句在执行时,可能生成某种违例,但是并不能确定如何处理这种违例,则此方法。•表明该方法将不对这些违例进行处理,而由该方法的负责处理。public void readDatabaseFile(Stringfile)throws FileNotFoundException{……FileInputStreamfis= new FileInputStream(file);..……}200 / 50
•重写方法不能抛出比被重写方法范围更大的违例类型public class TestA{public void methodA()throws RuntimeException{……}}public class TestB1 extends TestA{public void methodA()throws ArithmeticException{……}}public class TestB2 extends TestA{public void methodA()throws Exception {……}201}抛出违例•首先要生成,然后通过语句实现抛出操作(提交给Java运行环境)throw new IOException();•可以抛弃的例外必须是或其子类的实例。下面的语句在编译时将会产生语法错误:throw new String(“throwException”);•如果一个例外在返回到main()时还未被处理,则程序将终止202
创建自定义异常•系统定义的异常主要用来处理系统可以预见的较为常见的运行错误,对于某个应用所特有的运行错误,则需要编程人员根据程序的特殊逻辑在用户程序里自己创建用户自定义的异常类和异常对象•这种用户自定义异常主要用来处理用户程序中特定的逻辑运行错误•用户自定义的所有异常类都是Exception的子类203第7讲常用类库204
Java类库•Java程序是由组成的,编写Java程序就是设计和确定它们的过程,一旦及其之间关系确定了,程序运行中各种可能的状态和状态转化原则也就确定了•根据实现功能不同,将系统标准类划分成不同的集合,每个集合是一个,合称为类库•类库是Java编程的,它可以帮助开发者方便、快捷地开发Java程序205Java 核心类包•java.lang──包含一些Java语言的核心类,包含了运行Java程序必不可少的系统类•java.io──是Java语言的标准输入/输出类库,包含实现Java程序与操作系统、用户界面以及其他Java程序做数据交互所使用的类•java.util──包含一些实用工具类•java.awt──包含了构成抽象窗口工具集(AWT)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)•java.applet──包含applet运行所需的一些类•java.net──用来实现网络功能的类库•java.util.zip──用来实现文件压缩功能•java.awt.event──用于事件处理的类库•java.sql──用于实现JDBC的类库,使用该包可以206使Java程序具有访问不同种类的数据库功能
Object 类•Object类是所有Java类的类•Object定义了所有对象都需要的状态和行为。如对象之间的比较、将对象转换为字符串、等待某个条件变量、当某条件变量改变时通知相关对象以及返回对象的类•如果在类的声明中未使用extends关键字指明其父类,则默认父类为类207Object 类主要方法•protected Object clone()生成当前对象的一个拷贝,并返回这个复制对象•public booleanequals(Objectobj)比较两个对象是否相同•public final Class getClass()获取当前对象所属的类信息,返回Class对象•protected void finalize()定义回收当前对象时所需完成的清理工作•public String toString()返回当前对象本身的有关信息,按字符串对象返回208 / 50
==操作符与equals方法•比较原则:引用类型数据比较引用基本类型数据比较数据值•equals()方法只能比较引用类型•―==‖可以比较引用类型及基本类型特例:•当用equals()方法进行比较时,•用―==‖进行比较时,209210
toString方法•toString()方法在Object类中定义,其返回值是类型,描述当前对象的有关信息,内容因具体的对象而异•在进行String与其它类型数据的连接操作时,自动调用了对应的toString()方法将其它类型数据转换为String类型•可以根据需要在用户自定义类中该toString()方法211数据类型类(封装类)针对八种基本定义相应的引用类型基本数据类型booleanbyteshortintlongcharfloatdoubleByteShortIntegerLongCharacterFloatDouble212封装类Boolean
Math类•用来完成一些常用的数学运算,提供了若干实现不同标准数学函数的方法,这些方法均是static的类方法•存于java.lang包•是Object类的直接子类常用Math类方法public final static double E;数学常量epublic final static double PI;圆周率常量public static double abs(doublea);绝对值public static double max(doublea,doubleb);最大值public static double log(doublea);自然对数public static double rint(doublea);四舍五入public static double random();0~1间随机数213214
System类•System类•public static void exit(intstatus);err;in;out;System类的属性有三个:•public static void gc();例:char c=System.in.read();System.out.println(“Hello!”);215216 / 50
向标准输出写出数据System.out/System.err的println/print方法println方法从标准输入读取数据标准输入System.inprint方法217218
import java.io.*;public class KeyboardInput{public static void main(String args[]){String s;InputStreamReaderir=new InputStreamReader(System.in);BufferedReaderin = new BufferedReader(ir);try{s = in.readLine();while(!s.equals(“")){ System.out.println(”Read: “ + s);s = in.readLine();}in.close();} catch(IOExceptione){e.printStackTrace();}}219}系统属性•在Java中,系统属性起到替代环境变量的作用(环境变量是平台的)•可使用System.()方法获得一个Properties类的对象,其中包含了所有可用的系统属性信息•获得特定系统属性的属性值,可使用System.(String name)方法220
Properties 类(java.util.Properties)•Properties类可实现import java.util.Properties;import java.util.Enumeration;public class TestProperties{public static void main(String[] args){Properties ps= System.getProperties();Enumeration pnames= ps.propertyNames();while(pnames.hasMoreElements()){String pn=(String)pnames.nextElement();String p = ps.getProperty(pn);System.out.println(pn+ ” is “ + p);}}}222••••propertyNames()方法getProperty方法load方法save方法221
String 类String类对象保存不可修改的符序列,即表示的是字符串常量字String 类常用方法•public intlength();当前对象中字符个数•public booleanstartsWith(Stringprefix);判断当前字符串的前缀是否为指定字符子串•public booleanendsWith(Stringsuffix);判断当前字符串的后缀是否为指定字符子串•public intindexOf(intch);查找当前字符串中指定字符第一次出现位置•public intindexOf(intch,intfromIndex)查找当前字符串中自指定位置之后,指定字符第一次出现位置224一般情况下,一个String字符串一经创建,无论其长度还是内容,都不能修改public String()public String(Stringvalue)public String(StringBufferbuffer)public String(charvalue[ ])223 / 50
String 类常用方法•public intindexOf(Stringstr);public intindexOf(Stringstr,intfromIndex);public intlastIndexOf(Stringstr);public intlastIndexOf(stringstr,intfromIndex);在当前字符串中查找指定子串•public intcompareTo(StringanotherString);public booleanequals(ObjectanObject);public booleanequalsIgnoreCase(StringanotherString);比较两个字符串•public String concat(Stringstr);连接字符串225StringBuffer类StringBuffer类对象保存可扩充和修改的Unicode字符序列,即字符串变量构造方法–StringBuffer()–StringBuffer(intlength)–StringBuffer(Stringstr)226
StringBuffer类实现修改操作的方法–public StringBufferappend(类型参数名)追加操作–public StringBufferinsert(int插入位置,类型参数名)插入操作–public void setCharAt(intindex,charch)替换操作227日期类•创建日期类Date•获取日期和时间–getYear()–getMonth()–getDate()–getDay()–getHour()–getMinutes()–getSeconds()228
日期类•比较日期和时间–booleanbefore(DatecompareDate);–booleanafter(DatecompareDate);–booleanequal(ObjectcompareDate);随机类•随机类Random的构造方法public Random();public Random(long seed);229230
命令行参数任何Java应用程序都可以使用命令行参数命令行参数被系统以的方式传递给应用程序中的main方法,由参数接收public static void main(String[] args)命令行参数使用格式:java TestArgsarg1 arg2 ”another arg“231第8讲图形用户界面232 / 50
图形用户界面(GUI)•GUI(Graphics User Interface)图形用户界面,使用图形方式,借助菜单、按钮等标准界面元素和鼠标操作帮助用户更方便地向计算机系统发出命令,启动操作,并将系统运行的结果同样以图形方式显示给用户•通过GUI 用户和程序之间可以方便友好的进行交互•在java.awt包中包含许多支持GUI设计的类233抽象窗口工具集(AWT)•AWT(Abstract Window Toolkit)抽象窗口工具集•所谓抽象是因为Java是一种平台语言,要求其设计的图形用户界面必须支持平台。AWT类库中的各种操作被定义在一个并不存在的―‖中进行,使得开发人员设计的界面独立于具体的界面实现234
抽象窗口工具集(AWT)•AWT中定义了多种和,用于在Application和Applet中进行GUI设计•Java 程序要显示的GUI 组件必须是抽象类的子类•生成GUI所需的基本元素位于两个包中,即为java.awt包和javax.swing包•swing组件类一般都是由awt包中的基础类派生而成的,替代了许多awt包中的类235设计和实现图形用户界面1.创建组成界面的2.定义GUI的事件和236
Java.lang.ObjectEventBorderLayoutFlowLayoutGridBagLayoutMenuComponentMenuBarMenuItemComponentButtonContainerpanelAppletwindowDialogFrameScrollPane237组件(Component)Java的图形用户界面的最基本组成部分是组件,组件是一个可以以的方式显示在屏幕上并能与用户进行交互的,例如按钮、标签等组件不能独立地显示出来,必须将组件放在一定的中才可以显示出来抽象类是所有Java GUI组件的共同父类,它规定了所有GUI组件的基本特性,其中定义的方法实现了作为一个GUI部件所应具备的基本功能238AWT类及层次关系
属性设置属性的方法setBounds(Rectangle)setBounds(int,int,int,int)setCursor(Cursor)setDropTarget(DropTarget)setEnabled(boolean)setFont(Font)setLocale(Locale)setLocation(Point)setLocation(int,int)获取属性的方法Color getBackground()Rectangle getBounds()Cursor getCursor()DropTargetgetDropTarget()booleanisEnabled()Font getFont()Color getForeground()Locale getLocale()Point getLocation()Point getLocationOnScreen()String getName()Dimension getSize()booleangetVisible()240组件定位•决定Java组件在容器中的位置和尺寸•如果想要人工控制组件在容器中的大小和位置,可先,然后使用组件类的下述成员方法–––239背景色setBackground(Color)边界光标拖放使能字体地区位置前景色setForeground(Color)组件名setName(String)尺寸setSize(Dimension)可见性setVisible(boolean)/ 50
容器类(Container)容器类(Container)实际上是类的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其它组件和容器的功能容器类是一个类,包含了所有容器组件都必须具有的属性和方法容器类对象可使用方法添加组件241容器类型•Window、Frame、Dialog和FileDialog是边框的容器•Panel和Applet是容器242边框的容器•ScrollPane:可以自动处理滚动操作的
Window类•可自由停泊的窗口,即一个Window或Window的子类都不能作为组件用add()方法添加到其他容器内部,必须独立存在,但可以包容其他组件•Window不能作为程序的容器•Window创建的窗口默认为见,可以利用方法显示•Window缺省为布局管理器•Window可引发类的事件和事件243Frame类•Frame类是抽象类的子类•Frame一般用于Application程序的图形用户界面容器•Frame是所有窗口的容器,但是可‖,有外。244•Frame不能被其他容器所以被其他容器并弹出•Frame对象显示效果是一个―边框,且带有和
Frame类•默认初始化为见的,可使用setVisible()方法使之变为可见•器,可使用认布局管理器为Frame对象默认布局管理方法改变其默方法方法方法设置245•向Frame窗口中添加组件使用•从Frame窗口中移出组件使用•利用和获取标题方法和import java.awt.*;public class FrameExample{private Frame f;public FrameExample(){f = new Frame(” The blue Frame!“);}public void launchFrame(){f.setSize(300,200);f.setBackground(Color.blue);f.setVisible(true);}public static void main(String args[]){FrameExampleguiFE=new FrameExample();guiFE.launchFrame();}}246
Panel类•Panel类对象提供容纳组件的空间•Panel类对象不同的布局管理器采用和所在容器Panel类继承层次java.lang.ObjectComponentContainerPanel247248•Panel 放在Window、Frame或Applet等容器中•Panel类对象是一块边框的区域•可以向Panel类对象中放入基本组件
/ 50
import java.awt.*;public class FrameWithPanel{private Frame f;private Panel pan;public FrameWithPanel(Stringtitle){f = new Frame(title);pan = new Panel();}public void go(){f.setSize(200,200);f.setBackground(Color.yellow);f.setLayout(null);pan.setSize(100,100);pan.setBackground(Color.red);f.add(pan);f.setVisible(true);}public static void main(Stringargs[]){FrameWithPanelfwp=new FrameWithPanel(”Framewith Panel“);fwp.go();}249} 布局管理器•Java语言为了使生成的图形用户界面具有良好的性,提供了布局管理器这个工具来管理在容器中的布局,而不使用的方式•每个容器布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器250
布局管理器•FlowLayout:•BorderLayout:•GridLayout:•CardLayout:•GridBagLayout:251类默认的布局管理器类默认的布局管理器FlowLayout布局管理器设置布局管理器命令setLayout(newFlowLayout(intalign,inthgap, intvgap))•align:设置对齐方式•FlowLayout.LEFT•FlowLayout.RIGHT•FlowLayout.CENTER缺省是居中•hgap/vgap:水平间距/垂直间距,缺省值为5252
import java.awt.*;public class FlowExample{private Frame f;private Button b1;private Button b2;private Button b3;public FlowExample(){f = new Frame(”FlowLayout“);b1 = new Button(”Button1“);b2 = new Button(”b2“);b3 = new Button(”thethridButton“);}public void go(){f.setLayout(newFlowLayout());f.add(b1);f.add(b2);f.add(b3);f.setSize(100,100);// f.pack();f.setVisible(true);}public static void main(Stringargs[]){FlowExamplefe= new FlowExample();fe.go();}}FlowLayout的构造方法new FlowLayout(FlowLayout.RIGHT,20,15);new FlowLayout(FlowLayout.LEFT);new FlowLayout();253254
BorderLayout布局管理器•将整个容器的布局划分成东、西、南、北、中五个区域,组件只能被添加到指定的区域•如不指定组件的加入部位,则默认加入到区域•每个区域只能加入组件,如果加入多个组件,则。•是Frame类的默认布局管理器255BorderLayout布局管理器BorderLayout构造方法new BorderLayout()new BorderLayout(inthgap,intvgap)加入组件add(button, BorderLayout.align)256
/ 50
import java.awt.*;public class BorderExample{private Frame f;private Button bn, bs, bw, be, bc;public BorderExample(){f = new Frame(”BorderLayout“);bn= new Button(”NORTH“);bs= new Button(”SOUTH“);bw= new Button(”WEST“);be = new Button(”EAST“);bc= new Button(”CENTER“);}public void go(){f.add(bn, BorderLayout.NORTH);// f.add(bn, ”North“);f.add(bs, BorderLayout.SOUTH);f.add(bw, BorderLayout.WEST);f.add(be, BorderLayout.EAST);f.add(bc, BorderLayout.CENTER);f.setSize(200,200);f.setVisible(true);}public static void main(Stringargs[]){BorderExamplebe = new BorderExample();257be.go();}}GridLayout布局管理器在GridLayout构造方法中指定分割的行数和列数new GridLayout(3,4);setLayout(newGridLayout(introws, intcols));258 import java.awt.*;public class LayoutExample{private Frame f;private Panel p;private Button bw, bc, bfile, bhelp;public LayoutExample(){f = new Frame(”GUIExample 3“);bw= new Button(”West“);bc= new Button(”Workspace region“);bfile= new Button(”File“);bhelp= new Button(”Help“);}public void go(){f.add(bw, BorderLayout.WEST);f.add(bc, BorderLayout.CENTER);p = new Panel();p.add(bfile);p.add(bhelp);f.add(p, BorderLayout.NORTH);f.pack();f.setVisible(true);}public static void main(Stringargs[]){LayoutExamplele = new LayoutExample();260le.go()}}
import java.awt.*;public class GridExample{private Frame f;private Button b1, b2, b3, b4, b5, b6;public GridExample(){f = new Frame(”GridExample“);b1 = new Button(”1“);b2 = new Button(”2“);b3 = new Button(”3“);b4 = new Button(”4“);b5 = new Button(”5“);b6 = new Button(”6“);}public void go(){f.setLayout(new GridLayout(3,2));f.add(b1);f.add(b2);f.add(b3);f.add(b4);f.add(b5);f.add(b6);f.pack();f.setVisible(true);}public static void main(Stringargs[]){GridExamplege= new GridExample();ge.go();}}多布局实例259
事件•事件(Event)事件事件不只是针对Windows应用程序,多数控制和监视程序都是程序任何一个程序外部发生的事情,如开关关闭、温度到达了预先设置好的值,都可以注册成为事件在Java中,可以在自己的程序中创建事件,用一部分其他代码标志一些值得注意的事情发生。但是,我们所要关注的事件类型是在与程序交互过程中发生的261262•事件源(Event source)•事件处理者(Event handler)
import java.awt.*;public class ButtonEvent{private Frame f;private Button b;public ButtonEvent(){f = new Frame(”ButtonEvent“);b = new Button(”PressMe!“);b.setActionCommand(”ButtonPressed“);}public void go(){b.addActionListener(newButtonHandler());f.add(b,”Center“);f.pack();f.setVisible(true);}public static void main(Stringargs[]){ButtonEventbe = new ButtonEvent();be.go();}}import java.awt.event.*;public class ButtonHandlerimplements ActionListener{public void actionPerformed(ActionEvente){System.out.println(”Actionoccurred“);System.out.println(”Button'scommand is: “ + e.getActionCommand());}}263264
/ 50
事件代理•Java GUI设计中,通过式对所关注的事件源进行监控的方事件类•类,它们都是接或间接子类•EventObject类的getSource()方法包中定义了多个事件类的直•注册监听器时应指明该监听器监控的事件种类•当事件源发生了某种类型的事件时,只触发事先已就该种事件类型的监听器265•AWTEvent类的getID()方法266
Java事件分类java.awt.event包KeyEvent监听器接口•java.awt.event包中定义了十一个监听器接口,每个接口内部包含了若干处理相关事件的抽象方法•通常每个事件类都有一个与之相对应,而事件类中的每个具体事件类型都有一个具体的与之相对应,当具体事件发生时,这个事件将被封装成一个事件类的作为实际参数传递给与之对应的具体方法,由这个具体方法负责响应并处理发生的事件268java.util.EventObjectjava.awt.AWTEventActionEventAdjustmentEventComponentEventItemEventTextEventContainerEventInputEventFocusEventWindowEventPaintEventMouseEvent267
事件类型ActionEventItemEvent监听器接口ActionListenerItemListener监听器接口中的方法actionPerformed(ActionEvent)itemStateChanged(ItemEvent)mousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)mouseDragged(MouseEvent)mouseMoved(MouseEvent)keyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)focusGained(FocusEvent)focusLost(FocusEvent)事件类型监听器接口监听器接口中的方法AdjustmentEventAdjustmentListeneradjustmentValueChanged(AdjustmentEvent)componentMoved(ComponentEvent)ComponentEventComponentListenercomponentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)windowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)MouseEventMouseListenerMouseEventMouseMotionListenerWindowEventWindowListenerKeyEventFocusEventKeyListenerFocusListenerContainerEvent269ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)TextListenertextValueChanged(TextEvent)270TextEvent
import java.awt.*;import java.awt.event.*;public class TwoListenerimplements MouseMotionListener,MouseListener{private Frame f;private TextFieldtf;public TwoListener(){f = new Frame(”Twolisteners example“);tf= new TextField(20);}public void go(){Label label= new Label(”Clickand drag the mouse“);f.add(label, ”North“);f.add(tf, ”South“);f.addMouseMotionListener(this);f.addMouseListener(this);f.setSize(300, 200);f.setVisible(true);272}多重监听器•一般情况下,事件源可以产生多种不同类型的事件,因而可以注册(触发)多种不同类型的监听器•一个事件源组件上可以注册监听器,针对同一个事件源的同一种事件也可以注册监听器,一个监听器可以被注册到的事件源上271
/ 50
}public void mouseDragged(MouseEvente){String s = ”Mouse dragging:X=“ + e.getX()+ ” Y=“ + e.getY();tf.setText(s);} public void mouseEntered(MouseEvente){String s = ”The mouse entered“;tf.setText(s);}public void mouseExited(MouseEvente){String s = ”The mouse has left the building“;tf.setText(s);}public void mouseMoved(MouseEvente){ }public void mousePressed(MouseEvente){ }public void mouseClicked(MouseEvente){ }public void mouseReleased(MouseEvente){ }public static void main(Stringargs[]){TwoListenertwo = new TwoListener();two.go();}事件适配器类•为简化编程,针对大多数事件监听器接口定义了相应的类,即事件适配器类•在适配器类中,实现了相应监听器接口中所有的方法,但不做任何事情在定义监听器类时就可以继承事件适配器类,并只所需要的方法•适配器类实现了相应监听器接口,但所有方法体都是的273274
事件类型ActionEventWindowEventMouseEventMouseEventKeyEventFocusEvent监听器接口ActionListenerWindowListenerMouseListenerMouseMotionListenerKeyListenerFocusListener------适配器类事件适配器用法import java.awt.*;import java.awt.event.*;public class MouseClickHandlerextends MouseAdapter{public void mouseClicked(MouseEvente){……}}WindowAdapterMouseAdapterMouseMotionAdapterKeyAdapterFocusAdapter275276
import java.awt.*;import java.awt.event.*;class W1 extends Frame implements WindowListener{W1(){super(”Window1“);setSize(350,200);setVisible(true);addWindowListener(this);}public void windowClosing(WindowEvente){System.exit(0);}public void windowOpened(WindowEvente){}public void windowClosed(WindowEvente){}public void windowIconified(WindowEvente){}public void windowDeiconified(WindowEvente){}public void windowActivated(WindowEvente){}public void windowDeactivated(WindowEvente){}public static void main(Stringargs[]){new W1();}}窗口•利用事件监听器接口创建窗口•利用事件适配器类创建窗口–采用内部类设计–采用匿名类设计创建窗口一277278
import java.awt.*;import java.awt.event.*;import java.awt.*;import java.awt.event.*;创建窗口二class W2 extends Frame {W2(){super(”Window2“);setSize(350,200);setVisible(true);addWindowListener(newWin());}public static void main(Stringargs[]){new W2();}}创public class W3 {public static void main(Stringargs[]){Frame f=new Frame(”Window3“);建f.setSize(350,200);窗f.setVisible(true);f.addWindowListener(newWindowAdapter(){public void windowClosing(WindowEvente){口System.exit(0);三}});}}280class Win extends WindowAdapter{public void windowClosing(WindowEvente){System.exit(0);}}279
/ 50
Label 标签类•用于在屏幕上输出一行文本或提示信息•构造方法public Label();public Label(Stringstr);public Label(Stringstr,intalignment);对齐方式:Label.LEFTLabel.CENTERLabel.RIGHTButton 按钮类•用于触发特定动作•构造方法:public Button();public Button(Stringlabel);•方法:public String getLabel();public void setLabel(Stringlabel);•常用方法public String getText();public void setText(Stringstr);281public void setAlignment(intalignment);282
TextField文本框类•一个单行文本框,接收键盘输入的信息•构造方法:public TextField();public TextField(intcolumns);public TextField(Strings);public TextField(Strings,intcolumns);•方法:public void setEchochar(charc);public void setEditable(booleanb);283Checkbox复选框类•常用方法–getState()方法返回复选框选中状态,选中为true,否则为false–setState()方法设置复选框选中状态•事件响应–当用户点击复选框使其选中状态发生变化时就会引发ItemEvent类的选择事件284
Graphics类Graphics类是AWT的一个子类,包含图形方法,用于绘制图形和进行简单的图像处理,并可以设计动画•画直线在点(x1, y1)和点(x2, y2)之间画直线void drawLine(intx1,int y1,int x2,int y2);Graphics类•画矩形void drawRect(intx,inty,intwidth,intheight);void fillRect(intx,inty,intwidth,intheight);以当前颜色绘制实心矩形void drawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight);绘制圆角矩形285286
Graphics类Graphics类提供了在屏幕的指定位置上绘制字符串、字符和字节的方法public void drawString(Stringstring,intx,inty)public void drawChars(charchars[ ],intoffset,intnumber,intx,inty)public void drawBytes(bytebytes[ ],intoffset,intnumber,intx,inty)1.坐标点(x,y)与要绘制的字符串string、字符数组chars[ ]和字节数组bytes[ ]的坐下角相对应2.参数offset是数组的起始下标3.参数number是要绘制的元素个数287Font 类Font类设置所要显示文字的字体、大小和位置构造方法:Font(String name,intstyle,intsize)•字符名称name指字体•字符风格style是指字的外观:正常字体Font.PLAIN、黑体Font.BOLD、斜体Font.ITALIC•字体大小size以点(point)来衡量,1point为1/72英寸•使用Graphics类的方法void setFont(Fontfont)设置字体288
/ 50
Color 类•Color类将颜色按照RGB标准格式进行封装,该格式中红、绿、蓝三原色的取值范围都是0~255•构造方法public Color(intr, intg, intb)public Color(intr, intg, intb, inta)a为透明度参数对话框(Dialog)•构造方法:public Dialog(Dialogowner)public Dialog(Dialogowner,Stringtitle)public Dialog(Dialogowner,Stringtitle,booleanmodal)public Dialog(Frameowner)public Dialog(Frameowner,booleanmodal)public Dialog(Frameowner,Stringtitle)public Dialog(Frameowner,Stringtitle,booleanmodal)例如:Button b = new Button(”Test“);Color c = new Color(200, 170, 90);Color d = new Color(200, 170, 90, 120);b.setBackground(c)289owner对话框的所有者;title对话框的标题;modal模式选择,默认为true模式对话框,即打开后必须做出相应的对话框290
文件对话框(FileDialog)构造方法:public FileDialog(FrameParent)创建菜单1.首先创建一个对象,并将其置于一个可容纳菜单的容器中2.创建一个或多个们添加到先前创建的对象,并将它对象中public FileDialog(FrameParent,Stringtitle)public FileDialog(FrameParent,Stringtitle,intmode)3.创建一个或多个对象或对象,再将其加入到各对象中291292
import java.awt.*;public class Menu3{public static void main(String[] args){Frame f = new Frame(”Menu“);MenuBarmb= new MenuBar();f.setMenuBar(mb);Menu m1 = new Menu(”File“);Menu m2 = new Menu(”Edit“);Menu m3 = new Menu(”Help“);mb.add(m1);mb.add(m2);mb.setHelpMenu(m3);Menu m4 = new Menu(”Format“);MenuItemmi1 = new MenuItem(”New“);MenuItemmi2 = new MenuItem(”Save“,new MenuShortcut('s'));MenuItemmi3 = new MenuItem(”Load“);CheckboxMenuItemmi4 = new CheckboxMenuItem(”Show“);MenuItemmi5 = new MenuItem(”Quit“);m1.add(m4);m1.add(mi1);m1.add(mi2);m1.add(mi3);m1.add(mi4);m1.addSeparator();m1.add(mi5);MenuItemmi41 = new MenuItem(”FormatA“);MenuItemmi42 = new MenuItem(”FormatB“);m4.add(mi41);m4.add(mi42);f.setSize(220,240);f.setVisible(true);293}}Applet类•Applet类存于包中,是的子类•Applet是使用Java语言编写的一段代码,是在中运行的,必须创建一个文件,通过编写语言代码告诉浏览器载入何种Applet以及如何运行294
Applet类继承关系java.lang.Objectjava.awt.Componentjava.awt.Containerjava.awt.Paneljava.applet.Applet295Applet工作原理•编译好的文件保存在特定的文件的URL,可以通过方法获得play(getDocumentBase(), ”spacemusic.au“);308
在Applet中播放声音(AudioClip)AudioClip中的方法–play()–loop()–stop()AudioClip声音对象例如:public AudioClipgetAudioClip(URLurl)public AudioClipgetAudioClip(URLurl, String name)AudioClipsound;sound= getAudioClip(getDocumentBase(),”gong.au“);309Applet与URLjava.包中定义了一个URL类,用于描述网络上某一资源的地址。Applet有两个方法可以返回URL对象1.getDocumentBase()2.getCodeBase()310
流的概念第9讲Java网络程序设计及相关技术流式输入输出与文件处理流是指在计算机的输入与输出之间运动的数据的序列−输入流:代表从外设流入计算机的数据序列,只能从流中读取数据,而不能向其写出数据−输出流:代表从计算机流向外设的数据序列,只能从流中写入数据,而不能从中读取数据312311
/ 50
输入输出流类包中定义了多个流类型(类或抽象类)来实现输入/输出功能类FileOutputStreamInputStreamWriterReaderRandomAccessFile字符流和字节流按处理数据的单位划分,Java支持两种基本的流类型: 字符流和字节流字节流InputStreamOutputStream字符流ReaderWriter说明该类对象表示通向一个用于输入或者输出的文件路径,或者通向一个目录的路径字节流式输出操作的基础类字节流式输入操作的基础类字符流式输出操作的基础类字符流式输入操作的基础类对随机访问文件提供支持的类313输入流输出流314
InputStream类InputStream类是抽象类java.lang.Objectjava.io.InputStreamjava.io.FileInputStreamjava.io.PipedInputStreamjava.io.ObjectInputStreamjava.io.SequenceInputStreamjava.io.ByteArrayInputStreamjava.io.StringBufferInputStreamjava.io.FilterInputStream315InputStream类read方法•abstract intread()•intread(byte[] b)•intread(byte[] b, intoff, intlen)316
InputStream类read()方法是方法,为了让继承InputStream类的子类可以针对不同的外部设备定义不同的read()方法Java规定read()方法必须配合处理机制来使用,所以使用read()方法时,必须加入来执行例外处理,或利用来执行错误控制317InputStream类•public long skip(longn)•public void mark(intreadlimit)•public void reset()•public void close()318
OutputStream类OutputStream类是抽象类java.lang.Objectjava.io.OutputStreamjava.io.FileOutputStreamjava.io.PipedOutputStreamjava.io.ByteArrayOutputStreamjava.io.FilterOutputStreamjava.io.ObjectOutputStream319OutputStream类write方法•abstract void write(intb)•void write(byte[] b)•void write(byte[] b, intoff, intlen)320
/ 50
Reader类ReaderBufferReaderCharArrayReaderFilterReaderInputStreamReaderStringReader321Reader类read方法•intread()•intread(char[] cbuf)•abstract intread(char[] cbuf, intoff, intlen)322
Reader类•void close()•booleanready()•long skip(longn)•void mark(intreadAheadLimit)•void reset()323Writer类WriterBufferWriterCharArrayWriterFilterWriterOutputStreamWriterPrintWriterPipedWriterStringWriter324
Writer类Writer类•当数据传送到流的时候Unicode字符会被自动转换成本地计算机使用的编码•字符输出流用于向一个文件中写入文本内容,或者把数据的字符串表示形式写入文件325write方法–void write(intc)–void write(char[] cArray)–abstract void write(char[] cArray,intoff, intlen)–void write(Stringstr)–void write(Stringstr, intoff, intlen)326
节点流和处理流•节点流数据输入输出流•实现在数据源和程序之间加入数据过滤处理,将原始数据加入了数据类型处理功能•数据输入输出流DataInputStream和DataOutputStream分别是过滤输入输出流FilterInputStream和FilterOutputStream的子类•数据输入输出流DataInputStream和DataOutputStream分别实现了DataInput和DataOutput的接口,允许对不同数据类型进行读写操作327328•处理流
/ 50
DataInputStream类DataInputStream方法−−−−−−−−−byte readByte()booleanreadBoolean()long readLong()char readChar()double readDouble()float readFloat()short readshort()intreadInt()String readLine()329DataOutputStream类DataOutputStream方法−void writeByte(byte)−void writeBoolean(boolean)−void writeLong(long)−void writeChar(char)−void writeDouble(double)−void writeFloat(float)−void writeshort(short)−void writeInt(int)−void writeBytes(String)−void writeChars(String)330
缓冲输入输出流流式输入与输出方法在一个操作中一般只允许把很少量的数据如一个字符或者字节写入或者读出。这样传送数据效率低。若一个流配有一个缓冲区,则称为缓冲流。一个缓冲区就是专门用于把发送到一个外部设备或者从一个外部设备读出的数据集合起来的一块内存可以使用BufferedInputStream类和BufferedOutputStream类为输入输出流添加一个缓冲区331将文件内容读入一个带缓冲的流的步骤1.用要写入的文件名和路径生成一个File类型的对象2.用该File类型的对象作为FileInputStream类的一个实参生成与特定物理文件相对应的输入节点流对象3.将这个流对象传递给BufferedInputStream类对象,使其带有缓冲区4.将BufferedInputStream类对象传递给用来读入数据的流对象DataInputStream对象332
将一个带缓冲的流写入一个文件的步骤1.用要写入的文件名和路径生成一个File类型的对象2.用该File类型的对象作为FileOutputStream类的一个实参生成与特定物理文件相对应的节点流对象3.将这个流对象传递给BufferedOutputStream类对象,使其带有缓冲区4.将BufferedOutputStream类对象传递给用来写入数据的流对象DataOutputStream对象333import java.io.*;public class NodeStreamTest{public static void main(String[] args){try {FileReaderinput = new FileReader(args[0]);FileWriteroutput = new FileWriter(args[1]);char[] buffer = new char[128];intcharsRead;charsRead= input.read(buffer);while(charsRead!=-1){output.write(buffer, 0, charsRead);charsRead= input.read(buffer);}input.close();output.close();} catch(IOExceptione){System.out.println(e);}}}334
import java.io.*;public class BufferedStreamTest{public static void main(String[] args){try {FileReaderinput = new FileReader(args[0]);BufferedReaderbufInput= new BufferedReader(input);FileWriteroutput = new FileWriter(args[1]);BufferedWriterbufOutput= new BufferedWriter(output);String line = bufInput.readLine();while(line!= null){bufOutput.write(line, 0, line.length());bufOutput.newLine();line = bufInput.readLine();}bufInput.close();bufOutput.close();} catch(IOExceptione){ ……}}}335文件(File)•File 对象表示的是通向硬盘上的一个实际文件或者目录的路径,而不是一个流。可以生成表示通向相关文件或者目录的路径的对象•Java.io.File文件类提供获取文件基本信息,以及其它与文件相关的操作336
/ 50
方法说明文件(File)•new File(Stringstr)•new File(Filef ,String str)•new File(Stringstr1,String str2)例如:File myFile=new File(”F:/java/myFile1.java“);File myDir=new File(”F:/java“);File myDir=new File(”F:/java“);File myFile=new File(myDir,”myFile1.java“);File myFile=new File(”F:/java“ ,”myFile1.java“);337getName()返回一个String对象,包含该文件名,没有路径;对于表示一个目录的File对象,则指返回目录名getPath()list()返回一个包含File对象路径的String对象,其中包含文件名或路径名如果当前File对象表示一个目录,返回一个包含该目录成员名字的String数组;如果当前File对象是一个文件,返回null如果当前对象表示一个目录,返回File对象数组,对应该目录中的文件和目录;如果当前对象不是一个目录或出现I/O错误,返回null返回一个long类型值,指出当前File对象所表示的文件的字节长度;如果当前对象是一个目录,则返回0返回当前File对象的一个String表示,当一个File对象与一个String对象进行连接操作时,将自动被调用338listFiles()length()toString()
•构造方法:随机存取文件类(RandomAccessFile)•要想随机访问一个文件必须使用RandomAccessFile类•随机访问文件不是一个流,因此不能缓冲存储•RandomAccessFile类定义了所有读操作都通过DataInput提供,在DataOutput中定义了所有写操作,即实现了与这两个接口3391.RandomAccessFile(Filefile, Stringmode)2.RandomAccessFile(Stringname, Stringmode)访问模式(mode):r:文件必须事先存在,只对文件进行读取rw:先写文件后读文件,如文件不存在则建立常用方法•••longgetFilePointer();void seek(long pos);long length();340
import java.io.*;public class RandomAccessFileExample{public static void main(Stringarg[]){try{RandomAccessFileraf= newRandomAccessFile(”testRand.txt“,”rw“);for(inti=0;i<10;i++)raf.writeDouble(i*1.1);raf.close();raf=new RandomAccessFile(”testRand.txt“,”rw“);raf.seek(6*8);raf.writeDouble(55.50);raf.close();raf=new RandomAccessFile(”testRand.txt“,”r“);for(inti=0;i<10;i++)System.out.println(i+”:“+raf.readDouble());raf.close();}catch(FileNotFoundExceptione){System.out.println(e);}catch(IOExceptione){System.out.println(e);}341}}流类CharArrayReaderCharArrayWriterByteArrayInputStreamMemoryByteArrayOutputStreamStringReaderStringWriterStringBufferInputStreamPipedReaderPipedWriterPipePipedInputStreamPipedOutputStreamFileReaderFileWriterFileFileInputStreamFileOutputStreamI/O功能从/向内存数组读写数据从/向内存字符串读写数据实现管道的输入和输出统称为文件流。对文件进行读、写操作342
I/OObjectSerializationDataConversionPrinting流类ObjectInputStreamObjectOutputStreamDataInputStreamDataOutputStreamPrintWriterPrintStreamBufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream功能对象的输入、输出读、写基本数据类型包含方便的打印方法在读入或写出时,对数据进行缓存,以减少I/O的次数。343344程序•程序是一段静态的代码,它是应用软件执行的蓝本Buffering
/ 50
进程•进程是程序的,它对应了从代码、执行到执行完毕的一个完整过程,这个过程也是进程本身从的过程•作为执行蓝本的同一段程序,可以被多次加载到系统的内存区域分别执行,形成不同的进程345线程•线程是•线程是比进程•一个生多个的顺序控制流的执行单位程在其执行过程中,可以产程,形成多条执行线索•每个线程有它自身的产生、存在和消亡的过程346
•每个进程都有程切换的开销的代码和数据空间,进。Java主线程每个Java程序都有一个缺省的主线程•Application的主线程是main()方法执行的线索•Applet的主线程是指浏览器加载并执行Java小程序348•同一类线程代码和数据空间,每个线程有的运行栈和程序计数器(PC),线程切换的开销。•多进程•多线程347
Java线程•要想实现多线程,必须在主线程中创建新的线程对象•Java的线程是通过的类来实现的包中创建阻塞解除调度就绪状态运行状态线程状态与生命周期阻塞状态导致阻塞的事件终止•将一个虚拟的CPU,封装在Thread类,每个线程的代码通过Thread类和虚拟的CPU打交道,而Java虚拟机占用一个程,同时运行许多虚拟的CPU,多个虚拟的CPU间的协调不需要人为编码349350
1.创建状态(new)•创建一个新的线程•新线程处于创建状态,具有相应的内存空间和其他资源,但是没有真正执行它,因此系统并不为此线程分配CPU资源3512.可运行状态(Runnable)•创建线程之后,如要执行,则需对线程进行登记,并为它分配CPU系统资源,这些工作通过start()方法来完成•此时线程不一定正在运行,是否运行由Java的运行系统来协调决定。各种不同操作系统协调这些线程的方式是不同的352
/ 50
3.阻塞状态(Blocked)就是一个线程因为人为或系统原因必须让出CPU并暂时停止运行,以后还可以恢复运行的状态4.终止状态(Dead)自然终止:正常运行完成了run()方法的全部工作后终止异常终止:线程被提前强制性终止,如调用了一个stop()方法等353354
线程调动与优先级Java线程•每个线程都是通过某个特定Thread 对象所对应的方法run()来完成其操作的,方法run()称为线程体•Java多线程系统会给每个线程自动分配一个线程的优先级,任务较紧急重要的线程,其优先级就较高•在线程排队时,优先级高的线程可以排在较前的位置,能优先享用处理器资源;而优先级较低的线程则只能等前面高优先级线程执行完毕后才能获得处理器资源355356
线程的优先级•线程的优先级用数字来表示,范围从1到10,一个线程的缺省优先级是5 Thread.MIN_PRIORITY= 1Thread.MAX_PRIORITY= 10Thread.NORM_PRIORITY= 5线程的调度•Java提供一个线程调度器来监控程序启动后进入就绪状态的所有线程•线程调度器按照线程的优先级决定应调度哪些线程来执行357358•获得或设置线程对象的优先级intgetPriority();void setPriority(intnewPriority);
创建线程:继承Thread类实现多线程Java实现多线程的两种途径–创建Thread线程类的子类–在用户自定义类中实现Runnable接口359•通过继承java.lang包中的Thread类来创建自己的线程对象,该继承类重写Thread类中的run()方法•Thread类的构造方法public Thread()public Thread(Runnabletarget)public Thread(Stringname)public Thread(ThreadGroupgroup, Runnabletarget);public Thread(ThreadGroupgroup, String name);360
/ 50
public class MyThreadextends Thread {inti;public void run(){i = 1;while(true){System.out.println(”MyThread: “ + i++);if(i == 50)break;}}public static void main(Stringargs[]){Thread t = new MyThread();t.start();inti = 1;while(true){System.out.println(”MainThread: “ + i++);if(i == 50)break;}}}361创建线程:实现Runnable接口通过创建Runnable接口的实现类对象作为一个线程的目标对象,这种方法用Runnable目标对象初始化Thread类,由目标对象来提供run()方法362
public class TestThread{public static void main(Stringargs[]){inti=1;MyRunnermr= new MyRunner();Thread t = new Thread(mr);t.start();while(true){System.out.println(”MainThread: “ + i++);if(i == 50)break;}}}class MyRunnerimplements Runnable{inti;public void run(){i = 1;while(true){System.out.println(”MyThread: “ + i++);if(i == 50)break;}}}两种创建线程方法的比较直接继承Thread类–不能再从其他类继承–编写简单,可以直接操纵线程实现Runnable接口–可以将CPU、代码和数据分开,形成清晰模型–还可以从其他类继承–保持程序风格的一致性363364
•start()方法:启动线程对象,启动线程是使线程进入到就绪(可运行)状态,并不一定立即开始执行该线程•sleep()方法:线程暂时休眠,让出处理器资源•stop()方法:强制终止某线程的生命周期365方法isAlive()getPriority()setPriority()Thread.sleep()wait()notify()/notifyAll()功能判断线程是否还―活‖着,即线程是否还未终止获得线程的优先级数值设置线程的优先级数值将当前线程暂时休眠可指定时间当前线程进入对象的wait pool唤醒对象的wait pool中的一个/所有等待线程366
多线程间的协调与配合•线程同步•线程死锁class Stack{inti = 0;char[ ] data = new char [10];public void push(char c){data[i] = c;i ++;}public char pop(){i--;return data[i];}}367368
/ 50
线程同步•避免多个线程对同一资源的访问•引入管程(类似于进程信号量)•每个被同步资源都对应一个管程,首先占用这个资源的线程同时拥有了该资源的管程,在它完成操作释放管程前,其他欲访问同一资源的线程只能等候管程,从而实现了线程对资源的独占369互斥锁•每个对象都对应于一个可称为―互斥锁‖的标记(即系统在运行时分配给该对象一个管程),并保证在任一时刻,只能有一个线程访问该对象,可保证共享数据操作的完整性•关键字synchronized来与对象的互斥锁联系•当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问370
class Stack{inti = 0;char[ ] data = new char [10];public void push(char c){synchronized(this){data[i] = c;i++;}}public char pop(){synchronized(this){i--;return data[i];}}}}371同步•synchronized 除了象上面放在对象前面限制一段代码的执行外,还可以放在方法声明中,表示整个方法为同步方法public synchronized void push(charc){ …}•如果synchronized用在类声明中,则表明该类中所有方法都是同步方法public synchronized class Stack{ …}372
死锁•在多线程竞争使用多资源的程序中,如果A线程正等待B线程所占用的资源(具有的互斥锁、管程),而B线程也在等待A线程占用的资源•此时哪个线程都不能继续运行,而哪个线程都无法运行完成同步程序块373线程交互•java.lang.Object类中定义了wait()、notify()和notifyAll()三个方法•wait()方法使当前正在执行的线程暂时挂起,进入阻塞状态,放弃当前占用的管程,在管程队列中等待•notify()方法从管程队列中选择优先级最高的一个被挂起的线程,唤醒它,使其占用该管程及相关资源374
class SyncStack{ private intindex = 0;private char []data = new char[10];public synchronized void push(charc){while(index== data.length){try{this.wait();} catch(InterruptedExceptione){ }}this.notify();data[index] = c;index++;}public synchronized char pop(){while(index==0){try{ this.wait();} catch(InterruptedExceptione){ }}this.notify();index--;return data[index];375}}传输控制协议TCP•TCP是一个基于连接的协议,可在两台相连计算机之间提供可靠的数据流•HTTP、FTP、Telnet都是基于点对点通信的TCP协议377 47 / 50
网络连接•当程序需要建立网络连接时,必须有一台机器运行一个程序,随时等候连接,而另一端的程序则对其发出连接请求•两个程序连接前必须达成一致,即由Client端负责初始化连接,而Server端随时等候请求378网络连接•当程序建立网络连接时,需要知道IP地址或主机名(由32bit点分十进制数表示),还需要一个端口号(由16bit十进制数表示)•连接到正确主机后,需要通过端口号确认连接该端口所对应数据•只有Client端和Server端指定连接地址一致时连接才会建立379
Socket•两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个socket(套接字)•socket(套接字)通常用来实现Client/ Server连接Socket•java.net包中定义的两个socket类Socket和ServerSocket,分别用来实现双向连接的Client和Server端•建立连接时所需的寻址信息–远程计算机的计算机名或IP地址–试图连接的端口号381380
Socket通信模型服务器ServerSocket(port#)ServerSocket.accept()利用socket和服务器交互•双向通信要在服务器端和客户机端分别编程并分别运行•服务器端首先要建立一个ServerSocket,以指定端口号并监听客户机的请求,还要建立一个Socket用来和客户机通信•客户机端要建立套接到同一个端口的Socket以便和服务器通信382383客户机Socket(host,port#)Socket()OutputStreamInputStreamSocket.close()OutputStreamInputStreamSocket.close()
网络编程的基本步骤1.创建socket2.将特定的输入/输出流连接到打开的socket3.按照一定的协议对socket进行读/写操作4.关闭socket384ServerSocket构造方法ServerSocket(intport)ServerSocket(intport, intcount)•port 指连接端口号•count 指服务器所能支持的最大连接数385
/ 50
Socket类的构造方法Socket(InetAddressaddress, intport)Socket(InetAddressaddress, intport, booleanstream)Socket(Stringhost, intport)Socket(Stringhost, intport, booleanstream)客户端Socket的建立Socket socket;try{socket = new Socket(”127.0.0.1“,2000);}catch(IOExceptione){//…}386387
InetAddress类•用来区分计算机网络中的不同计算机并对其寻址•常用方法–getHostName()–getLocalHost()服务器端Socket的建立ServerSocketserver = null;try {server=new ServerSocket(2000);}catch(IOExceptione){ //…}Socket socket=null;try {socket=server.accept();}catch(IOExceptione){ //…}388389
打开输入/输出流PrintStreamos;os= new PrintStream(new BufferedOutputStream(socket.getOutputStream()));DataInputStreamis=new DataInputStream(socket.getInputStream());关闭Socketos.close();is.close();socket.close();390391
URL•URL统一资源定位器,表示Internet上某一资源的地址•URL组成包括:协议名:资源名•URL举例http://392URL类构造方法•public URL(Stringspec)URL u1 = new URL(”http://online.btvu.org/“);•public URL(URL context, String spec)URL u2 = new URL(u1, ”index.html“);•public URL(Stringprotocol, String host, String file)URL u3 = new URL(”http“, ”online.btvu.org“, ”index.html“);•public URL(String protocol, String host, intport, String file)URL u4 = new URL(”http“, ” online.btvu.org“, 80,”index.html");393 49 / 50