??xml version="1.0" encoding="utf-8" standalone="yes"?> _读一章内容,手工输入一章代码(?Q,与书中描q的思想q行印证Q实在搞不懂放q吧。设计模式绝对不会一ơ就看懂的?/p> q本书对于理解设计模式很有帮助,是例子不太W合中国人的思维模式Q但是坚持下去肯定会搞明白的?/p> 全书_֍Q?/p> 1. Chap12的DucksQ通过一点点重构DucksE序Q将模式一个个加入其中Q帮助对模式的深入理解?/p> 2. Chap12的DJViewQ通过一个完整的MVCE序Q将Observer、Strategy、Composite以及Adapter模式用架构层面的设计整合hQ不仅可以更好地理解单个模式Q还可以理解MVC模式?/p> 可能对每个模式写出自己的ȝ 注: 1. 源代码一定要M载,书上的代码内容不够,也可以参考我的代码?/p> q本书还没看完,但是l对是案头必备,虽然用C++写的代码Qƈ且是四个牛h写的风格Q相关知识背景与E序员不同)Q但是一旦开始理解设计模式以后,再回q头会发现这本书的定义和描述最Ҏ理解和记忆?/p> 《Head First设计模式?/p> 自学、初学的推荐用书。我也是通过q本书才真正明白设计模式。虽ӞGoF提出?3个模式,但是Q只要把主要几个搞明白了Q就入门了Q其他的模式只有真正实践的时候才会需要,否则看了也就是了解一下?/p> 《Java与模式?/p> 十年前,我绝对认为是本好书。因为那个时候可以参考的中国人写的设计模式的书实在太,但是现在我对q本书的评h只能可以了。因Z者的举例跟我的项目经验没有重叠,作者对古典文学的运用反而又l我理解设计模式增加了困难,因此q本书不再作为我推荐的书Q只作ؓ看完《Head First设计模式》后的补充阅读,q且不需要太x书中的代码和那些文学描述Q只看作者关于模式与实际应用的描q就可以了?/p> 《设计模式解析?/p> q本书不推荐。除非你有过一些设计模式的理解Qƈ且还有实际项目的设计l验Q否则这本书对初学的帮助不是很大。我的感觉作者应该是用来作ؓ自己上课的教材,因此q本书除非可以跟着作者边学边读,否则自学会觉得只讲了些理念上的东西,能够帮助理解模式的项目或者代码是不的?/p> 《设计模式初学者指南?/p> W三ơ放弃读q本书,主要是对我不太实用,而且作者的思\也与我不同,读v来不太顺畅。每ơ重M几次才明白作者想表达什么,作者是个好E序员,写的代码也非常漂亮,只是比较xl节和自我实现过E中的理解,对于l常写代码的JavaE序员可能帮助会更多些,对于只是想了解概念和思\显得有点啰嗦了?/p> 补充Q理解设计模式最好的Ҏ是目与代码,q且在不断地重构目和代码中加深理解。对于别的什么例子,看v来似乎对理解有帮助,但是听多了只会更加糊涂?/p> 自学前需要的条gQ已l具备基本的计算机基?/p> 1Q已l对一U编E语a比较熟悉Q?/p> 2Q有q四q计机专业学习Q或者三q以上的软g开发经验, 自学的方法: 1Q完全自学:手工输入代码Q看懂习题的{案?/p> 注:把下载的代码q行通过是不行的Q自行输入代码也是对Java语言的熟悉过E?/p> 2Q结伴学习:通过讨论深入理解代码Q结伴搞定习题?/p> 3Q前辈指|由前辈帮助搭建编E环境,避过自学q程中需要面对的其他q扰。帮助理解与Java相关的其他计机的知识点Q从而避免遇到因此某些地方不懂而升L退却心理?/p> ȝQ最完美的的以上三种l合Q但是不基于什么方法,完全的自学都是必ȝ?/p> Z么说q是一本Java入门书? 因ؓ此书只是全面讲述了在Java~程q程中可能遇到的各种知识点,而对q些知识点ƈ没有展开和深入,d此书后可以对Java~程有个全面的了解,但是如果在工作中遇到q些问题Ӟ仍然需要去找更加专业的书籍来深入学习?/p> 例如Qƈ发编E。作者只是介l了如何用Java~写多线E的E序Q但是对于死锁问题只提供了例子,q没有深入分析,也没有给出更加具体的解决ҎQ因不是此书的关注点?/p> Z么很多hq不推荐用来入门Q?/p> 我的感觉q本书可能是一本教材,是作者用来培训JavaE序员的Q所以书中对许多知识点ƈ没有l出铺垫Q因本书已经很厚了,所以作者只好在译֠上铺垫了Q。那么过多的计算机方面的知识Q例如:面向对象、设计模式、IO处理、ƈ发编E等{)很容易Z生挫折感而放弃这本很厚很厚的书,甚至攑ּJava语言?/p> 因此Q我的经验是如果你没有多q的软g~程l验Q也没有比较全面的计机知识Q那么最好找个前辈指导着学习Q因为很多时候兴比什么都宝贵?/p> 后记Q此书值得反复阅读。“书d遍,其义自见。”作者不仅在Java语言斚wQ而且在计机其他领域斚w也有很深的造诣。读透一本书Q就可以充分领悟除这本书以外作者在其他斚w的心得?/p>
Java~程思想Q英文第4版)part1 , part2+源代?/font>
Thinking in Patters v0.9Q中文版Q?/a>
Java~程思想是不是一本好书呢Q当Ӟ在书中作者详l解释了Java的v源和语言的特点,通过学习q本书可以知ӞJavaQ然也可以知其所以然。读懂这本书后,你不仅仅是个会写E序的编码工人,而是成ؓ一个专业的E序员?/font>
q本书可否作为入门书c呢Q其实,作ؓJava的入门也未尝不可Q只是因为其庞大的块头和相对艰ӆ的内容会使大部分初学者半途而废。如果完全没有编E功底的人,当然׃要以此入门了Q这l对是自虐?/font>
如何快速学习这本书呢?直接看Java~程思想W?版,跌W?章,从第2章开始所有理论知识都跌Q手工输入所有代码,调试成功Q然后再回过头看相关理论知识Q能看懂多少看多,看不懂的留下来,{以后在实践中碰C再回头学习?/font>
如何深入学习q套书呢Q有强大意志力的可以从第1版开始往后看Q看到第4版就可以对Java语言的发展史有个深刻的理解,甚至对于E序设计语言的发展历史也会有所了解Q这个很重要Q,因ؓ所有的语言其实都是盔R的。一门语a理解以后Q再学其他语aQ如QC++、Python{)都会明白q个语言的特点在哪里Qؓ何要q样设计语言Q用在什么场合下效果最好。如果这个语a因ؓ设计的需要缺某些特性的时候,可以通过什么方法来解决。例如:Java 1.4以前是没有泛型的Q那么第3版就没有介绍泛型的用,而第4版才引入了泛型,那么通过ҎW?版和W?版,既可以深入理解泛型的好处Q也可以知道如何通过其他手段来解册个问题?/font>
虽然此书完整覆盖了Java的知识点和数据结构的基础问题Qƈ且对每个部分都做了基本说明。但是因为没有深入展开Q对于以自学的方式阅L书的读者,如果没有基础的会感觉内容太多太杂Q学习过E会觉得怸着头脑Q但是对于基较好的读者又会觉得书中的描述有种隔靴搔痒的感觉,d一遍没啥收莗?/p>
但是如果作ؓ教材则具有自q优势Q作者从Java语言入手Q一步步推进到数据结构,使Java语言和数据结构的学习自然的结合在一P从而避免了在许多学校教学过E中因ؓ分别讄两门评而带来的p问题。例如:许多同学都是先学语言Q再学数据结构。可能会遇到一个学期学Java语言Q另一个学期学数据l构Q结果Java的语法早在考试后还l老师了,从而学习数据l构的过E比较困难。更p糕的是学习数据l构时用的~程语言不是JavaQ结果就学完数据结构了依然不会使用Java来解x据结构中的许多经兔R题?/p>
但是Q如果老师使用q个教材Q可以根据自q需要调整讲解的深度和需要展开的内容,q可以帮助学生直接利用Java语言的特性来解决某些数据l构的问题,比如QJava的泛型和集合cL实现数据l构的链表,使学习很有针Ҏ,也更Ҏ产生兴趣?/p>
2. 通过我对本书的学习,其他读者也像作者一P从实践出发。一定要自己把书中的代码都输入到计算ZQ按照作者的思\熟悉~程工具和JAVA的知识点。在阅读q程中,我发现本书中文版的代码排版有误,那么读者可以根据自q能力q行U错Q通过U错也可以加深对代码的理解,实在搞不定了再参考作者或者我提供的源代码?/p>
重要事情说三遍:一定要自己输入代码?/p>
因ؓ代码光看懂是不够的,一定要自己输入、调试和发现问题Q还可以修改代码从而加入自q一些想法,只有通过反复的实跉|能真正理解JAVA的知识点Q也是俗话说的学成自己的东ѝ?/p>
3. dq本书,其实q不能帮你立d成ؓ一定合格的JAVAE序员,甚至你还是不太会写程序,但是恭喜你“入门了”?/p>
4.如果惌省时间和_֊Q那p个专业的老师带着你阅诅R因为,旉是金钱Q?/p>
原作者的代码Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/Java7Beginners.rar">我自p入和做了部分修改的代?/a>?/p>
只记录了P213后面的错误代码,如果后面发现P213前面的错误代码Q会l箋补齐。但我提供的代码都是可以正常q行的,如果有用者发C文版书中其他的错误代码请告诉我,方便我在q里补齐Q谢谢?/p>
P213Q重构代码有误,作者在源代码中提供的正代码如下:
public ShootingGalleryTargetRow(Image sprite, int value) { targetValue = value; newTargetTicker = 0; this.sprite = (BufferedImage)sprite; }
P220Q函C的System.exit(1)因ؓ前面抛出了异常,所以永q无法执行,直接删除?
public Image getSpriteBySize(int size) { ...
throw new IllegalArgumentException("Unknown Sprite Size: " + size); System.exit(1); ... }
P250Q用泛型GenericRole<String, String>未定义类型?/p>
public class GenericRoleProgram { public static void main(String[] args) { LinkedList<GenericRole<String,String>> roleMap=new LinkedList<GenericRole<String, String>>(); ... }
原作者的代码Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/Java7Beginners.rar">我自p入和做了部分修改的代?/a>?/p>
搜烦了网上,l了许多解释Q这个作者的说明q要详尽些:http://blog.csdn.net/czmchen/article/details/6176178
但是Q我个h认ؓ问题是出在32位的Eclipse应用?4位的JDK的冲H上Q因此直接采用上文中提到的第二种ҎQ修改Eclipse.ini文gQ增?/p>
-vm
C:/Java/jdk1.6.0_10/bin/javaw.exe // q行是32位JDK的安装位|,不同的电脑可能JDK的位|不?/p>
当然Q也可以在本Z直接安装32位和64位两UJDKQ系l启动时׃自动选择Q但是自动选择׃D刚开始启动时速度有点慢?/p>
Z重新拣v对Java的回忆,只好又找了本基础书。由于成都高新图书馆的计机书实在不多,只能扑ֈq本了。简单读了下Java部分Qȝ如下Q?/font>
优点Q虽然本书也是作者编的而不是作者著的,但是可以看出作者编写此书时是有个自q思\的。与10q前的中国h~写的计机书相比,不再是简单的转蝲Q而是手中的资料通过自己的理解诏I在一赗ƈ且书中的内容和练习也有机地结合在一P可以边读边练习,增加了对知识的理解?/font>
~点Q?/font>
ȝQ对于已l有一定语a基础Q或者作师上课的教材,本书仍是不错的选择?/font>
中间启动了许多次Q但又因为各U原因被停。就q闭兛_习期_也多ơ想攑ּQ总觉得太单,最后还是选择了这本书而放弃了其他书,原因是马上要q书了,“书是非借不能读Q”不q,坚持自己最初的选择Q完成了q本书的学习q是值得的。因为很多年不碰Java语言了,总需要一本书把基拣v来,通过坚持d一本书Q可以从作者的角度对Java有个完整的回。同Ӟ闭关学习期间Q通过有所攑ּQ才觉得专注做好一件事Q放下对其他事的贪心Q尽量将生活单化真的很舒服?/p>
不过Q这U简单生zMq不Ҏ适应Q特别是刚开始闭养I当天d完成后就会贪心想多看。特别是看到最后几章时Q因书的旉点快CQ心里莫名的烦躁QL额完成dQ结果行Z开始抵触,甚至x弃不看。最后,只能以结束这本书为目的,每天都以臛_完成当天的Q务ؓ基本要求Q努力坚持到全书看完的那一天?/p>
今天全书的学习结束了Q好像放下一个很重的担子Q这本书其实隑ֺq不可及,Z么还是有心篏的感觉呢Q?/p>
2.合适就是好书?/p>
q是一本可以推荐给Java初学者的教材书,唯一不是书中的开发工具不是EclipseQ而是JCreatorQ要知道JCreator是要收费的,也不是国内主的开发工P初学者不Ҏ扑ֈ相关资料。因此对于用此书的初学者要不就需要自q悉JCreatorq个开发工P要不需要自行{换到Eclipse开发工具上。不q,全书涉及开发工L地方很少Q{换工作也不太复杂?/p>
当然Q这也不是一本经典的教材Q只是本得不用太qhl典。这本书仍然是作者多q教学实践后撰写的教材,书中有作者自qJava教学思\Qƈ且提供了许多Ҏ理解的例子,通过对这本书的学习能够对Java语言建立起一个较为全面的认识?/p>
其实QJava语言的成功不仅仅依赖于语a本n的特Ԍq有其深ȝ语言设计思想和它的Y件开发工具包QSDKQ,q绝对不是几本书p学会的,当然q本书也不具备这个能力?/p>
3.理解源于实践?/p>
做练习是q几q学习数学的q程中才接受的。因Z前看书,总觉得看懂就可以了,l习做来做去都是些重复劳动,只是巩固一下基的知识,收获不大。于是,心里Lx些有看点的书来读。可是读的书不少了,仍然觉得无法深入Q好像L些地方书里没说清楚。后来实在没有办法了Q因为数学书本本都是那么抽象Q对于概忉|多少解释Q只好做习题q可以落实一下那些定理。当习题做到后面的章节,H然发现前面有些不明白的地方豁然开朗了。于是,以后的学习中都把做练习作为必选项Q因为在实践的过E中才发觉最初对知识点的理解只是W统的、抽象的Q只有通过做题才能对细节深入,才能把别人写的东西变成自q理解?/p>
24.2 语言的尺?br>Java语言短小、紧凑,以C++为基Q放弃了一些特定的语言特征Q指针和多承)
注:需要关注的是ؓ什么放弃这两个特征Q有没有替代ҎQ各自的优缺炏V?/p>
24.2.1 指针QpointerQ?br>指针是一U变量,q且变量中包含了某个存储器地址?br>Java不允怋用指针,因ؓ指针指向的是具体的物理地址Q直接操U늉理地址中的数据Q容易ɽE序出现不可预料的问题?br>Java通过创徏引用Q)来实现对地址的访问。通过引用也可以把地址作ؓ变量传送?/p>
24.2.2 多承(multiple inheritanceQ?br>多承允怸个类l承于多个超cR?br>Java不允许多l承Q因为多l承使用不多Q且~程复杂Q容易出错?br>Java允许l承一个基c,实现多个接口的方式实现多l承?/p>
24.3 语言的可靠?br>24.3.1 别名QaliasQ?br>别名会导致不同的对象变量指向同样的对象?br>因ؓ对象变量中存储的对象地址相同Q从而出C个修改同一对象数据的入口,Ҏ造成h?br>为此Java提供了两U拷贝机Ӟ深拷贝(对象的数据的拯Q和拷贝(对象的引用的拯Q?br>深拷贝可以保护原始对象不受媄响,但是需要消耗时间和I间Q用于保护数据安全的领域使用。利用cloneҎ?br>拷贝提供了原始对象的地址Q不需要消耗过多的旉和空_但是必须心的用,以免造成不可预料的问题。利用别名机制?/p>
24.3.2 重写cloneҎ
protected的方法可以被重写为public的方法,但是public的方法不可以重写为protectedҎ?br>注:因ؓ已经在父cdl是public的方法,q子类重写为protectedҎQ那么访问者依然可以通过父类实现讉KQ所以不容许publicҎ重写成protectedҎ?/p>
24.3.3 不变对象
如果对象中不存在变更它们状态的ҎQ则对象UCؓ不变对象?br>如果对象是不可变的,则不必担心创建对象的别名会造成不可预料的问题?/p>
24.3.4 使用ObjectcȝcloneҎ
ObjectcȝcloneҎ复制了分配给对象属性的存储器的内容Q也UCؓ按位拯Qbitwise copyQ。即完全复制了原始类型(primitive typeQ的属性的内容Qƈ且复制了属性的引用?br>* 如果cȝ属性都是基本类型的Q则重蝲cloneҎ只需要调用ObjectcȝcloneҎQ?br>* 如果cȝ属性有对象cd的,q且q些对象都是不可变的Q则重蝲cloneҎ只需要调用ObjectcȝcloneҎ?br>* 如果cȝ属性包含非不可变对象,则无法利用ObjectcȝcloneҎq行复制Q必自q写代码来实现cloneҎ?/p>
如果需要用ObjectcȝcloneҎQ需要标识类实现了Cloneable接口Q这个接口也是个标识接口Q没有包含Q何方法?/p>
24.3.5 垃圾攉
Java使用异常处理技术来监视内存耗尽问题Qƈ且可以编写代码来保E序正常地终止?br>Java语言h一U内嵌的垃圾攉功能Q该功能能够释放未被使用的内存。通过搜烦E序所使用的内存空_释放不再被用的内存?/p>
自测题:
1. 指针与引用的区别Q?br>指针保存了地址Qƈ且可以通过代码修改和操U这个地址的数据?br>引用保存了地址Q但是这个地址不能通过代码修改Q也不能随便改变讉K的类型,例如Q不能按字节讉K地址中的信息?/p>
2. 多承:
多承允怸个类l承于多个超cR?br>Java不允许多l承Q因为多l承使用不多Q且~程复杂Q容易出错?br>Java允许l承一个基c,实现多个接口的方式实现多l承?/p>
3. Critical.java
a) 因ؓCritical对象存在变更它们状态的ҎQ所以是可变对象?/p>
b) CriticalTest.java
c) Critical.java
d) CriticalTest.java
4.
a) Z么方法返回的都是别名Q方便调用的Ҏ修改里面的数据,对于不可变对象也提高传送数据的效率?br>b) Z么别名可能有危险Q因用方法的代码可能会修改原始数据,造成不可意料的数据错误?br>c) 如何避免别名Q创建cloneҎQ返回的对象都采用深拯?/p>
5. 垃圾攉功能的优点和~点Q?br>优点Q简化程序员的工作,避免出现内存泄漏或者内存耗尽的问题?br>~点Q降低代码执行的速度Q对于实时应用会H然出现响应不及时的问题?/p>
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
Critical.java CriticalTest.java
23.1 引言
服务器(serverQ程序ؓ其他客户端(clientQ程序提供某U类型的服务Q与客户端程序通常位于不同的机器上?br>一个程序可以既是服务器E序也是客户端程序,主要是看它是在ؓ其他E序服务Q还是在使用其他E序的服务?br>甚至q可以整合其他服务器E序上的服务Q打包成自己的服务,提供l客LE序使用?/p>
23.2 applet
applet是一UJavaE序Q能够从|页中下载ƈ在浏览器中运行。因为Javaq行在虚拟机上,因此可以做到q_独立Q得程序与客户Z的操作系l无兟?/p>
23.3 讉Kq程数据?br>Java数据库连接(Java Database Connectivity, JDBCQ:是Java讉K数据库的通用接口Q数据库理pȝ提供JDBC驱动Q从而保证应用程序不需要关注不同数据库的区别?br>驱动QdriverQ是一UYӞ能够使得两个E序q行通信Q或者帮助Y件与g通信?/p>
23.4 Socket
Socket是一UY件机Ӟ能够帮助E序员隐藏传输数据的l节Q类g高文g处理cd助程序隐藏外部存储器的细节,
使得E序能够Z的方式来处理网l连接上的数据的d?/p>
自测题:
1. 客户--服务器体pȝ构:
服务器(serverQ程序ؓ其他客户端(clientQ程序提供某U类型的服务Q与客户端程序通常位于不同的机器上?br>一个程序可以既是服务器E序也是客户端程序,主要是看它是在ؓ其他E序服务Q还是在使用其他E序的服务?br>甚至q可以整合其他服务器E序上的服务Q打包成自己的服务,提供l客LE序使用?/p>
2. applet和应用程序的区别Q?br>applet和应用程序都是一UJavaE序?br>applet是运行在览器的JVM中;而应用程序是q行在操作系l的JVM中?br>applet没有main()ҎQ因为它q行在浏览器中,控制d由浏览器负责Q应用程序则包含main()ҎQmain()Ҏ中可以控制程序的所有行为?/p>
3. 专用的appletҎQ与paintҎ一赯行)
initQapplet被浏览器装蝲Q或者重新装载)Ӟ首先调用的方法?br>startQinitҎ被调用后调用的方法;每一ơ返回页面得applet可见Ӟ也会调用的方法?br>paintQstartҎ被调用时Q立卌用的Ҏ?br>stopQ当applet被隐藏时Q选择了浏览器其他面Q,调用的方法?br>destroyQ当applet被抛弃时Q关闭了览器)Q调用的Ҏ?/p>
4. JDBC技?br>Java数据库连接(Java Database Connectivity, JDBCQ:是Java讉K数据库的通用接口Q数据库理pȝ提供JDBC驱动Q从而保证应用程序不需要关注不同数据库的区别?/p>
5. SocketcdServerSocketcȝ功能和用途?br>Socketcȝ基本功能Q?br>* q接到远E机器;
* 发送数据;
* 接收数据Q?br>* 关闭一个连接?br>ServerSocketcȝ附加功能Q?br>* l定一个端口;
* 在绑定的端口上监听进入的数据Q?br>* 在绑定的端口上接受远E客L的连接;
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. ChangingFaceApplet.java
2. MetricConverterApplet.java RedCircleApplet.java
3. ProductQuery.java
4. 挖坑。。?br>5. JokeServer.java JokeClient.java RunJokeServer.java RunJokeClient.java
6. 挖坑。。?/p>
1Q服务提供者框Ӟ
W合JDBC 4.0规范的驱动程序包含了一个文件META-INF/services/java.sql.DriverQ在q个文g中提供了JDBC驱动实现的类名?/font>
例如Qmysql-connector-java-5.1.40-bin.jar文g中就可以扑ֈjava.sql.Driver文gQ用文本~辑器打开文g可以看刎ͼcom.mysql.jdbc.DrivercR?/font>
JVM的服务提供者框架在启动应用时就会注册服务,例如QmySQL的JDBC驱动׃被注册,而原代码中的Class.forName("com.mysql.jdbc.Driver")仍然可以存在Q但是不会v作用?/font>
2QClass.forName("com.mysql.jdbc.Driver");
通过对类com.mysql.jdbc.Driver初始化,执行静态初始化代码Q调用DriverManager注册JDBC驱动?/font>
注:通过setProperty的测试,认ccom.mysql.jdbc.Driver也没有加载,那么静态初始化代码肯定被执行了Q但是如果服务提供者框架已l注册的服务Q这里注册会p|Q编E的预期是这LQ可是理ZDriverManager.registerDriver可以重复注册的,Z么这里不能重复注册呢Q?/font>
3QSystem.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver";);
讄JVM的系l属性,当JVMW一ơ加载DriverManagercLQ会执行cȝ静态初始化代码Q代码中调用loadInitialDrivers()ҎQ就会加载设|的属性对应的c,执行cȝ静态初始化代码完成注册?/font>
注:因ؓ注册的机制无法深入理解,只知道没有加载过的类可以注册成功Q加载过的就不能重复注册了?/font>
注:setProperty必须在DriverManagerW一ơ运行前才有效,说明”服务提供者”框架注册服务时q没有加载类Q因Z旦加载类׃执行cȝ静态初始化代码Q那么注册JDBC驱动׃定会调用DriverManagercȝ静态初始化代码Q那么setProperty׃失效Q所以说明注册服务是不加载类的?/font>
4QDriverManager.registerDriver(new com.mysql.jdbc.Driver());
其实前面?Q和3Q最l都是通过q个Ҏ注册的,但是q个Ҏ可以重复注册?/font>
注:对于重复注册后,建立链接时用哪个驱动我׃明白了,可以取消注册Q取消的关键字是Z创徏的对象的Q所以就重名也不会出错?/font>
注:q种注册方式没有前面几种好,因ؓq种注册方式会在代码中与需要注册的驱动E序的类l定Q前面都可以通过配置参数实现注册?/font>
二、各自特点:
1Q全自动。只要提供符合规范的JAR文g可以了?/font>
2Q利用反机Ӟ驱动类注入C码中Q不需要与代码l定?/font>
3Q基于系l的属性设|方法,驱动类注入C码中Q但是好像只能绑定一个JDBC驱动?/font>
4Q最l的注册机制。会出现重复注册Q但是好像对E序没媄响,q需要与代码l定Q驱动变了,必须修改代码Q维护成本过高,当然也是灉|性最好,理最方便的?/font>
以下是测试代码:
import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Enumeration; /** * @author p?Tom 试JDBC驱动注册 */ public class JDBCDriverTest { public static void main(String[] args) { Driver aDriver; Connection connection; Enumeration em; // “org.gjt.mm.mysql.Driver”是“com.mysql.jdbc.Driver”的子类Q其构造函数就是调用父cȝ构造函数?/span> String driverString = "com.mysql.jdbc.Driver"; // String driverString = "org.gjt.mm.mysql.Driver"; String url = "jdbc:mysql://localhost/ElectricalStore?useSSL=false"; String username = "admin"; String password = "123456"; try {
// DriverManager的日志流输出到ConsoleH口中,方便监控 // DriverManager.setLogStream(System.out); // DriverManager.println("------DriverManager logs start!------"); // 只是讄了一个JVM的系l属性,q不建立JDBC驱动E序? // 建立JDBC驱动是依赖系l第一ơ调用DriverManagercLQ执行了q个cȝ静态初始化代码中的loadInitialDrivers()Q? // 加蝲驱动的方法会把设|的jdbc.drivers属性对应的驱动c通过DriverManager.registerDriver注册到JDBC中? // 因此Q必L在DriverManager被第一ơ调用之_也就是需要将前面那两行代码注释掉 System.out.println("1.1> Tried to use setProperty."); System.setProperty("jdbc.drivers", driverString); System.out.println("---List of all jdbc drivers---"); em = DriverManager.getDrivers(); // 获取已加载JDBC驱动E序的Enumeration if (!em.hasMoreElements()) { System.out.println("There is no JDBC drivers"); } else { while (em.hasMoreElements()) { aDriver = (Driver) em.nextElement(); System.out.println(aDriver); } } System.out.println("1.2> we tried to use Class.forName"); // Class.forName(driverString)在JavaSE 6.0后符合JDBC 4.0规范的驱动可以不? // Z服务提供机制Q?Service Provider mechanismQ, // pȝ会自动搜索mysql-connector-java-???-bin.jar中的META-INF/services/java.sql.Driver // q个文g会包含mysql jdbc驱动E序的入口:com.mysql.jdbc.Driver // 应用E序调用Class.forName()也不会出错,只是什么都不会执行? // 因ؓClass.forName()是执行静态初始化代码Q已l初始化q的cd无法Ȁz这D代码了 // System.setProperty("jdbc.drivers",driverString);与Class.forName()一栗?/span> try { Class.forName("com.mysql.fabric.jdbc.FabricMySQLDriver"); } catch (ClassNotFoundException e) { System.out.println("Driver not found"); } System.out.println("---List of all jdbc drivers---"); em = DriverManager.getDrivers(); // 获取已加载JDBC驱动E序的Enumeration if (!em.hasMoreElements()) { System.out.println("There is no JDBC drivers"); } else { while (em.hasMoreElements()) { aDriver = (Driver) em.nextElement(); System.out.println(aDriver); } } System.out.println("1.3> we tried to use DriverManager.registerDriver"); // 手工注册mySQL的JDBC驱动E序Q也出C与mySQLl定q紧的问题,如果以后需要更换驱动,需要修改代码? // pȝ容许出现重复注册同样的jdbc驱动c?/span> DriverManager.registerDriver(new com.mysql.jdbc.Driver()); DriverManager.registerDriver(new com.mysql.fabric.jdbc.FabricMySQLDriver()); DriverManager.registerDriver(new com.mysql.jdbc.Driver()); System.out.println("---List of all jdbc drivers---"); em = DriverManager.getDrivers(); // 获取已加载JDBC驱动E序的Enumeration while (em.hasMoreElements()) { aDriver = (Driver) em.nextElement(); System.out.println(aDriver); } System.out.println("<1.5> Deregister all JDBC drivers"); em = DriverManager.getDrivers(); // 获取已加载JDBC驱动E序的Enumeration while (em.hasMoreElements()) { aDriver = (Driver) em.nextElement(); DriverManager.deregisterDriver(aDriver); // 已l注册的驱动E序取消注册 } em = DriverManager.getDrivers(); // 获取已加载JDBC驱动E序的Enumeration if (!em.hasMoreElements()) { System.out.println("2.1> Now, there is no JDBC driver"); } System.out.println("2.2> we tried to use Class.forName again"); try { Class.forName(driverString); } catch (ClassNotFoundException e) { System.out.println("Driver not found"); } try { Class.forName("com.mysql.fabric.jdbc.FabricMySQLDriver"); } catch (ClassNotFoundException e) { System.out.println("Driver not found"); } try { Class.forName(driverString); } catch (ClassNotFoundException e) { System.out.println("Driver not found"); } em = DriverManager.getDrivers(); // 获取已加载JDBC驱动E序的Enumeration if (!em.hasMoreElements()) { System.out.println("There is no JDBC drivers"); } else { System.out.println("---List of all jdbc drivers---"); while (em.hasMoreElements()) { aDriver = (Driver) em.nextElement(); System.out.println(aDriver); } } System.out.println("2.3> we tried to use setProperty again"); System.setProperty("jdbc.drivers", "com.mysql.fabric.jdbc.FabricMySQLDriver"); em = DriverManager.getDrivers(); // 获取已加载JDBC驱动E序的Enumeration if (!em.hasMoreElements()) { System.out.println("There is no JDBC drivers"); } else { System.out.println("---List of all jdbc drivers---"); while (em.hasMoreElements()) { aDriver = (Driver) em.nextElement(); System.out.println(aDriver); } } System.out.println("2.3> Tried to use DriverManager.registerDriver again"); DriverManager.registerDriver(new com.mysql.jdbc.Driver()); DriverManager.registerDriver(new com.mysql.fabric.jdbc.FabricMySQLDriver()); DriverManager.registerDriver(new com.mysql.jdbc.Driver()); System.out.println("---List of all jdbc drivers---"); em = DriverManager.getDrivers(); // 获取已加载JDBC驱动E序的Enumeration if (!em.hasMoreElements()) { System.out.println("There is no JDBC drivers"); } else { while (em.hasMoreElements()) { aDriver = (Driver) em.nextElement(); System.out.println(aDriver); } } System.out.print("3.1> Tried to establish a connection: "); connection = DriverManager.getConnection(url, username, password); System.out.println(connection); } catch (SQLException e) { System.out.println("Cannot registered the mysql jdbc driver"); } System.out .println("jdbc.drivers property: " + System.getProperty("jdbc.drivers", "nothing")); } }
q程Q一个运行的E序通常UCؓ一个进E?br>q发q程Qconcurrent processQ:两个或多个可以同时执行的q程UCؓq发q程?br>在多个进Eƈ发执行时Q每个进E都有自q存放E序代码和数据的存储I间Qƈ且每个进E的存储I间对于其他q程都是受保护的Q所有这些工作都由操作系l完成?/p>
22.3 U程QthreadQ:P552
U程Q一个程序执行的多个独立dUCؓU程。通常线E称量q程Qlightweight processQ,因ؓ也管理进E相比,理U程需要占用较的pȝ资源?br>U程没有完全独立的存储空_U程之间׃n代码区和存储区?br>理U程的方式也是基于时间切片原则,由JVM和OS协同理?/p>
22.4 Threadc?br>l承Threadcd现线E。控制线E用三个ҎQstart(), run(), finish()
主要执行代码在run()Ҏ中?br>注:run()Ҏl束后,q个U程p行结束了Q不可以再次调用Q必重新创建。原因也可参考图22-2的状态{换图Q线E进入TERMINATE状态中Q无法再ơ启动?/p>
22.5 U程的执行与调度
份额QquantumQ:每个q程或者线E都可以获得处理器上的一段旉--UCؓ份额Q然后轮转到下一个进E或U程?br>份额内时间没有用完时Q也可以使用sleep()ҎQ强制放弃CPU的占用权Q将CPUq给OSQ从而可以l分配给下一个进E或U程?br>注:sleep()Ҏ传入的时间间隔(以毫Uؓ单位Q,可能会抛出InterruptedException异常Q必d在try...catch代码块中?/p>
22.6 Runnable接口
创徏一个实现Runnable接口的类Q然后将cȝ实例作ؓRunnable接口的参C入Thread对象的构造函C?br>后面的工作主要就是操作Thread的对象,与前面扩展ThreadcȝҎ一样了?br>注:此处的Thread对象是独立创建的Q前面是对Threadcȝl承?/p>
22.7 U程同步QP562
异步行ؓQasynchronous behaviourQ:
在一般情况下两个或多个ƈ发执行线E的行ؓq不是协同的Q而且无法预知在某个时间段内哪个线E将会占用CPUQ这U非协同的行为称为异步行为?br>互斥讉KQmutual exclusionQ:需要将讉K~冲区的E序D늜作界区Qcritical sectionQ?-卛_M时刻只能被一个进E访问的区域Q实C界区的方式称Z斥访问?br>忙等待(busy waitingQ:被某个线E执行的Ҏ循环中反复执行,直到满某个条g才能l止。效率太低,可以使用wait()Ҏ线E挂P直到被其他线E的消息唤醒?br>在Java中创Z个monitor对象Q监视器Q,monitorcȝ所有方法在M时刻都只能被一个线E访问?br>可以在方法的头部使用synchronized修饰W,׃Ҏ被同?synchronized)Q所以一旦有某个对象调用该方法,那么该方法将被置上一个锁QlockQ,
其他对象必须在该Ҏ执行完成后才能访问它?br>?Qؓ什么要加锁Q是因ؓ你有临界区,对这个界区加锁才是目的?br>因此锁的目的Q当前类Q即this.静态变量)Q当前对象(即this.变量Q,当前对象中创建的对象Q即this.对象变量Q,外部传入到当前对象中的对象?/p>
?Q什么可以加锁?对象Q只有对象可以加锁?br>在Java中,每一个对象都拥有一个锁标记QmonitorQ,也称为监视器Q多U程同时讉K某个对象ӞU程只有获取了该对象的锁才能讉K?br>JVM会记录ƈ且监这个锁Q当U程获取锁后计数器由0?Q线E若讉K同样锁的其他ҎQ计数器q会l箋增加Q从而保证线E完全释放这个锁后才会允许其他线E访问?br>所以基本数据类型的变量是不能作Z界区的,也就不能被加锁?/p>
?Q怎么样加锁?使用synchronized寚w态方法、方法、对象变量加锁?br>static synchronized aStaticMethod(){...} // “当前类Q即this.静态变量)”加?br>synchronized aMethod(){...} // “当前对象(即this.变量Q”加?br>synchronized (aObjectVariable){...} // “当前对象中创徏的对象(即this.对象变量Q”或“外部传入到当前对象中的对象”加锁?/p>
22.8 U程状态:P563
状态{换图Q图22-2 一个线E的状态{换图
start()启动一个线E?->U程q入readyQ就l)状态?br>dispatch()调度一个线E?->U程q入runningQ运行)状态?br>U程q行旉时、yield()强制一个线E放弃CPU-->U程q入readyQ就l)状态?br>sleep()睡眠一个线E?->U程q入sleepingQ睡眠)状?->睡眠旉时-->U程q入readyQ就l)状态?br>wait()-->U程q入waitingQ等待)状?->获得其他U程notify()或notifyAll()Ҏ通知-->U程q入readyQ就l)状态?br>׃{待输入或等待外部设备可?->U程处于blockedQ阻塞)状?->d旉时或设备正?->U程q入readyQ就l)状态?br>run()Ҏ完成后,U程被终止?/p>
22.10 Timerc:调度U程
在固定时间间隔内生成ActionEvents对象。因此,必须一个Timer对象兌C个ActionListener对象?br>只要Timer对象生成一个ActionEvent对象Q都会执行与Timer对象相关的ActionListener对象的actionPerformed()Ҏ?/p>
自测题:
1. 如何通过旉切片实现q发QP552
旉切片Qtime-slicingQ:处理器只是完成了一个Q务的一部分工作Q然后完成下一个Q务的一部分工作Q?br>因ؓ处理吕每ơ完成工作的旉都非常短Q因此看hq些d是ƈ发完成的?/p>
2. q程与线E的区别QP552
每个q程都有完全独立的存储空_用于存放E序的代码和数据Qƈ且每个进E的存储I间对于其他q程都是受保护的Q所有这些工作都由操作系l完成?br>每个U程没有完全独立的存储空_U程之间׃nE序的代码和数据Q线E的调度由JVM和操作系l协同完成?/p>
3. 异步U程执行和同步线E执行的区别QP562
异步执行U程Q无法预知某个时间段内哪个线E将会占用CPUQ也无法估计E序执行的结果?br>同步执行U程Q确保线E对于界区是互斥访问的Q当某个U程执行同步代码Ӟ其他U程无法再调用同步代码,必须{待前面执行的进E解锁?/p>
4. 临界区和互斥的概念:P562
讉K~冲区的E序D늜作界区Qcritical sectionQ?-卛_M时刻只能被一个进E访问的区域?br>实现临界区的方式UCؓ互斥讉KQmutual exclusionQ?br>Jav提供了在多线E程序中实现互斥的机Ӟx个对象都有一个monitorQ监视器Q,monitorcȝ所有方法在M时刻都只能被一个线E访问?br>只需要在Ҏ的头部用synchronized修饰W,׃Ҏ被同步,所以一旦有某个对象调用该方法,那么q个Ҏ׃被上锁,其他对象如果同时惌问就必须{待?/p>
5. 如何在JavaE序中避免忙{待QP562
使用wait()Ҏ线E的执行挂vQ直到它收到另一个进E的消息它唤醒。就可以避免出现忙等待?/p>
6. Threads6.java RunThreads6.java
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
3. CounterVersionFour.java RunCounterVersion.java CounterThread.java
19.2 Border接口
8个实现Border接口的标准边框类Q?br>* BevelBorder
* SoftBevelBorder
* LineBorder
* EtchedBorder
* TitledBorder
* MatteBorder
* CompoundBorder
* EmptyBorder
19.3 Icon接口
19.5 对话框窗?br>* 选项Q显CZpd按钮供用户选择一个选项?br>* 输入Q允许用户通过文本域或列表输入数据?br>* 消息Q显CZ条消息和一个OK按钮?br>* 认Q询问用户一个问题,qؓ{案提供认与否的按钮?/p>
消息cdQ?br>* PLAIN_MESSAGE 不显CZQ何图?br>* INFORMATION_MESSAGE 昄提示图标
* ERROR_MESSAGE 昄错误图标
* QUESTION_MESSAGE 昄问题图标
* WARNING_MESSAGE 昄警告图标
自测题:
1. 创徏下面的对话框H口Q?br>
JOptionPane.showMessageDialog(null, "Have a nice day", "Happy Message", JOptionPane.PLAIN_MESSAGE); JOptionPane.showInputDialog(null, "Write the words \"I have made a stupid mistake\" below", "Silly Mistake", JOptionPane.ERROR_MESSAGE); JOptionPane.showConfirmDialog(null, "Are you here?", "Silly Question", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
2. 屏幕上颜色的创徏规则Q?br>三种基本颜色Q红、绿、蓝Q按不同比例混合q三U基本颜色就可以得到其他颜色。屏q上颜色是按照q三U颜色的不同亮度混合得到其他颜色的?/p>
3. 使用CardLayout理器的场景Q?br>适用于需要将界面分成不同的区域,q且每次只显CZ个区域的使用场景?/p>
4. 良好用户界面创徏的基本原则:
保持z:颜色要少、字体要、菜单不过三层?br>注意用户的特征Q针对具体的使用者设计用界面?br>考虑有障用L需求?/p>
5. 设计E序界面Ӟ为有障碍人士需要考虑的内容:
视觉障碍Q需要颜色对比强烈,注意提供语音提示?br>听觉障碍Q(不知道,自己没这个感受,也没扑ֈ相关资料。)
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. BorderTester.java
3. PasswordFieldTester.java
注:RunTest.java试该章的所有程序?/p>
2. 使用JMenuBarcRJMenucdJMenuItemcLZ拉菜单:
创徏一个菜单需要有三方面内容:端的菜单栏Qmenu barQ、不同的菜单QmenuQ以及每个菜单都有各自的菜单(menu itemQ列表?br>菜单项d到菜单中Q再菜单添加到菜单栏中Q最后将菜单栏添加到框架中?/p>
3. 模式对话框与非模式对话框的区别:P445
模式对话框处于可见状态时Q用户不可以与原框架q行交互Q只有先关闭模式对话框后才能与原框架交互?br>非模式对话框处于可见状态时Q用户仍可以与原框架q行交互Q甚臛_以直接关闭原框架Q非模式对话框也会与原框架一起关闭?/p>
4. 下拉菜单与弹出式菜单的用场景区别:
下拉菜单适用于全局环境Q弹出式菜单适用于特定环境?/p>
5. 弹出式菜单与对话框窗口的区别QP442
不希望原框架或窗体的一部分L用于交互可使用对话框窗口?/p>
6. 多个单选按钮如何一起工作?P445
创徏一个ButtonGroup对象Q将单选按钮一个个加入到该l中Q就可以一起工作了?/p>
7. FilecȝgetNameҎ与getPathҎ的区别:P453
getName只提供了文g的名UͼgetPath提供了文件的完整路径和名U?/p>
8. 如何判断JComboBox对象中的选中条目Q?br>getSelectedItem()函数可q回被选中的条目内宏V?/p>
9. 调用Notepad.exe的代码:
try { Runtime.getRuntime().exec("C:\\Windows\\notepad.exe"); } catch (IOException ioe) { System.out.println(ioe); }
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. 都实CQ没啥想修改的?br>2. DiaglogModalDemo.java RunDiaglogModalDemo.java
3. 囑Ş界面的就先不做了?br>4. SliderRectangleDemo.java RunSliderRectangleDemo.java
5. DrawFigure.java RunDrawFigure.java
注:基本的几个交互组仉已经在DrawFigure中用了Q不再做6题了Q图形界面太花时间?/p>
17.2 List接口和ArrayListc?br>* ArrayListc?br>* LinkedListc?/p>
17.2.1 泛型QgenericsQ:允许讑֮存在在特定聚焦类对象中的对象cd。可以将一个或多个cd作ؓ参数发送到一个类Q或接口Q中Q亦被称为参数化cd?br>优点Q允许编译检查类型;不必q行对象cd转换Q避免生ClassCastException异常?/p>
17.2.2 使用接口cd代替实现cd作ؓ函数的Ş?br>允许来修改实现的方式而不必修改Ş参中对象的类型?/p>
17.2.3 List接口的方?br>操作Q增加(addQ❶元素插在列表的末尾Q❷元素插入到列表中指定的位置?br>注:使用索引插入参数到列表中Ӟ必须保证索引是当前列表中的有效位|?br>修改QsetQ、删除(deleteQ?br>列表Q显C(toStringQ、LQsizeQ、是否空QisEmptyQ?br>元素Q位|(indexOfQ返回指定对象在列表中第一ơ出现时的烦引?br>获取QgetQ、存在(containsQ?/p>
17.3 增强的for循环Q数l、List接口、Set接口
不能用于修改或删除原始集合中的元素,因ؓ~译可以通过Q但是有可能DE序l果不可预测?/p>
17.4 Set接口和HashSetc?br>* HashSetc?br>* TreeSetc?/p>
17.4.1 Set接口的方?br>操作Q增加和修改QaddQ、删除(removeQ?br>列表Q显C(toStringQ、LQsizeQ、是否空QisEmptyQ?br>元素Q获取(getQ、存在(containsQ?/p>
17.4.3 Iterator接口Q用于修改和删除Set中的元素
使用Set对象中提供的Iterator对象?/p>
17.5 Map接口和HashMapc?br>* HashMapc?br>* TreeMapc?/p>
Map接口的方法:
操作Q增加和修改QputQ、删除(removeQ?br>元素Q关键字存在QcontainsKeyQ、值存在(containsValueQ、D取(getQ?/p>
17.6 JCF中用自定义c?br>Ҏ重写QtoString(); equals(); hashCode()
自测题:
1. 三种接口的区别:
* List列表Q元素ؓ单个对象Q元素在列表中是有序、可重复
* Set集合Q元素ؓ单个对象Q元素在集合中无序、不可重?br>* Map映射Q元素ؓ成对对象Q第一个对象是关键字,W二个对象是|Q元素在映射中无序,关键字不可重?/p>
2. Map<String, Student> javaStudents = new HashMap<String, Student>();
a) 允许来修改实现的方式而不必修改Ş参中对象的类型?/p>
b) 可以一个或多个cd作ؓ参数发送到一个类Q或接口Q中Q亦被称为参数化cd?br>优点Q允许编译检查类型;不必q行对象cd转换Q避免生ClassCastException异常?/p>
c) javaStudents.put("U0012345","Fadi");
javaStudents定义的是StudentcdQ不能接收Stringcd的数据?/p>
3. StockItemc?br>a)
public String toString(){ return "("+stockNumber+","+name+","+price+","+totalStock+")\n"; }
b)
public boolean equals(Object objIn){ StockItem st = (StockItem) objIn; return stockNumber.equals(st.stockNumber); ?/span>
c)
public int hashCode(){ return stockNumber.hashCode(); }
4.
a)
String tmpString; boolean first=true; if (regNums.size()==0){ tmpString="{}"; } else { StringBuilder sb = new StringBuilder(); for (String item: regNums){ if (first) { sb.append("{"+item); first = false; } else { sb.append(","+item); } } sb.append("}"); System.out.println(sb);
Iterator<String> elements = regNums.iterator(); while(elements.hasNext()){ String item = elements.next(); if (item.charAt(item.length()-1)=='S' elements.remove(); }
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. NameStack.java NameStackException.java NameStackTest.java
a) 因ؓ需要可变大的存储I间Q而存储的对象必须是有序的Q但是是可以重复的?/p>
2. CarRegister.java CarRegisterException.java CarRegisterTest.java
a) 因ؓ需要可变大的存储I间Q而存储的对象可以是无序的Q但是必L一?/p>
3. Book.java Library.java LibraryTest.java
4. Bank.java BankAccount.java BankTest.java
a) HashMapc适合代替数组实现BankcR因为其可以满成对对象集合的需要,q可以确定关键字?/p>
1.Eclipse中如何配|JDK的Documents和SourcesQ?/p>
“Windows”?gt; “Preferences”?gt; “Java”?gt; “Installed JREs?/p>
选中需要配|的JREQ点 “Edit”,选中 “JRE system libraries”中需要配|的JAR文g?/p>
也可以点中其中一个,?“Ctrl+A”全选?/p>
* 在Eclipse中按F1看API的帮助:
?“Javadoc Location…”?gt; “Javadoc in archive”?gt; “External File”,
?“Archive path:”中配置下蝲的压~文Ӟ
?“Path within archive”中输入 “docs/api”,
然后?“Validate…”验证一下,最后点 “OK”?/p>
* 在Eclipse中看JDK的源代码Q?/p>
?“Source Attachment…”?gt; “External Location”,
?“Path:”中输入源代码压~文件所在的目录Q最后点 “OK”?/p>
16.2 创徏二维数组
索引?开始,创徏成表|W一个烦引是行烦引,W二个烦引是列烦引?br>length属性:W一个烦引的长度?/p>
16.3 初始化二l数l:数值用逗号分隔Q行用大括号分隔?/p>
16.4 不规则数l(ragged arrayQ:可变列数的二l数l?br>如果只声明但不初始化不规则二l数l,必须声明行数Q第一索引Q,可以不声明列敎ͼW二索引Q?br>问:不规则数l只能是二维吗?
{:不规则数l可以是多维Qƈ且都是必d明第一索引可以了?/p>
自测题:
1. 考虑下列数组声明语句Q该数组用于存储学生成W的集?br>
char [][] grades=new char[4][20];
a) 该数l有几个l度Q?br>2?/p>
b) grades.length的值是多少Q?br>4
c) grades[0].length的值是多少Q?br>20
d) W一l第一个学生的成W为B
grades[0][0]='B';
2. 声明合适的数组
a) q球敎ͼ20个球队,38场比?br>
int scores[20][38];
b) 座位Q?0行位,每行20个?br>boolean seats[70][20];
3. 记录火R晚点情况
a) 一q中W几周,每周中第几天晚点ơ数
int late[52][7];
b)
int daysNum=0; for (int i=0;i<52;i++) for (int j=0;j<7;j++) if (late[i][j]==2) daysNum++;
b) 不规则二l数ltriangle
int [][] triangle = new int[4][]; for (int i=0;i<4;i++) triangle[i]=new int[i+1];
c) triangle中的最大?br>
int biggestNum; biggestNum=triangle[0][0]; for (int i=1;i<4;i++) for (int j=0;j<triangle[i].length;j++) if (biggestNum < triangle[i][j]) biggestNum=triangle[i][j];
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. VarNoughtsAndCrosses.java RunVarNoughtsAndCrosses.java
2. CheckTrain.java CheckTrainTest.java InvalidDateException.java
3. TimeTable.java TimeTableException.java TimeTableTest.java
TimeTableGUI.java RunTimeTableGUI.java 做界面太消耗时间了Q暂时不做了?/p>
2. 已检查异常和未检查异常的区别是什么?P359
在编译器允许E序被编译通过前,要求E序员必ȝ写代码,告诉~译器如何处理由特定指o产生的已查异常?br>但是~译器对可能产生的未查异常ƈ不认为存在潜在的错误可能Q也׃会要求程序员必须~写代码处理Q只是希望程序员在编写代码时尽量避免出现这cd常?/p>
已检查异常:FileNotFoundException, IOException, Exception
未检查异常:NegativeArraySizeException, NumberFormatException, ArrayIndexOutOfBoundsException, RuntimeException
3.
a) 抛出异常QP357 每种D异常的事件类型都对应Java中一个预定义的异常类。当出现某个事gӞJavaq行环境׃判断出现异常的类型,
q且生成一个该异常cȝ对象。这个过E称为抛?throwing)异常?/p>
b) 声明异常QP361 是指为给定的Ҏ做一个标讎ͼ含义是该Ҏ可能会生成一个异常类的对象?/p>
c) 捕捉异常QP364 在某个位|可以控制异常对象,而不是仅仅抛出它们。在Java中,q个q程UCؓ捕捉异常(catching an exception)?/p>
4. finally语句的作用是什么?P367
无论tryE序块中发生M情况Q都希望在程序终止运行前执行一些特别的指oQ处理一些清理工作,因此需要在try...catchE序块的最后部分声明finallyE序块?/p>
5.
a) 不会~译错误
b) Integer.parseInt()和arrayIn[posIn]会抛出异?br>c) 输入字母Q导致NumberFormatExceptionQ输入超q数l边界的CDArrayIndexOutOfBoundsException?/p>
6. 什么情况下需要定义自q异常c?P378QP380
从构造函C报告错误的唯一Ҏ是用异常。但是抛出异帔R用异常对象Ҏ使程序无法通过名称知道问题的原因,
q需要借助于getMessageҎ来补充信息;q且用于处理特定异常对象的catch语句却将捕捉所有被抛出的异常,
因ؓ所有的异常都是从通用异常c?Exception)z的。ؓ了希望用与处理构造函数异怸同的方式来处理其他异常,
因此得创徏自己的异常类?/p>
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. ExceptionQ5.java
2.
a) ScannerTester.java
b) EasyScannerPlus.java
c) EasyScannerPlusTester.java
3. Hostel.java, ObjectList.java, Payment.java, PaymentList.java, Tenant.java, TenantList.java, NegativeSizeException.java
自测题:
1. 在类的开发过E中Q程序包的作用是什么?P321
E序包是Z方便定位和部|类Q还可以避免来cM间出现名U冲H?/p>
2. 哪些import语句合法Q哪些非法?
import java.*; // 书上说错Q代码中承认正确。因为java是个包,只是一个没有Q何类的包?/span> import java.swing.*; // 错。java下没有swingq个包?/span> import java.awt.JButton; // 错。java.awt包下没有JButtoncR?/span> import javax.swing.JButton; // 寏V?/span> import javaa.text.*.*; // 错。不能有两个* import javax.swing.*; // 寏V?/span>
3. package作用域的含义。P323
对类所在程序包中的其他cd见?/p>
4.
a) 三种Ҏ如下Q?br>(1) import javax.swing.*;
(2) import javax.swing.JButton;
(3) private javax.swing.JButton myButton;
b)
package gameApp; import javax.swing.JButton; class GameController { private JButton myButton; // more code here }
5. 所有程序包到javaBook目录?br>a) set classpath=c:\jCreator\myProjects\javaBook
b) java -cp c:jCreator\myProjects\javaBook
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. package hostelApp;
注:已经使用包了Q就不再修改Q只l出处理Ҏ?/p>
2. RunHostelFromPackage.java
3. LotteryNumber.java
2. 动态(q行Ӟl定和静态(~译Ӟl定的区别。P335
~译时绑?compile-time binding)或静态绑?static binding)技术:
当一个类的代码被~译后,该类的每个方法的代码都会随之~译Q编译器确保该cȝ对象接收一个调用其Ҏ的消息时Q?br>E序都会跌{到该Ҏ的代码的存储位置--该方法的指o会被执行,之后E序返回最初的位置?/p>
q行时绑?run-time binding)或动态绑?dynamic binding)技术:
每次创徏一个新的对象时Q必记录其Ҏ存储位置的信息;q样对于调用哪个Ҏ的决定可以推q到q行时决定?/p>
3.
a) 解释Java中接口和适配器的区别?br>接口Q?P336)是一个类的所有方法都声明为抽象方法。因此实现接口时必须接口的所有方法编码?br>适配器:(adapter,P348)是一个特D的c,实现了接口的所有方法,扮演cM接口之间的中介角Ԍl承适配器类׃必ؓ所有的Ҏ~码?/p>
b)
public interface SomeInterface{ public void method1(); public int method2(); }
public SomeAdapter extends SomeInterface{ public void method1(){ } pupblic int method2(){ } }
4. 解释内部cȝ作用Q描q内部类的用方法。P349
在Java中一个类只允许承一个超c,不能l承多个类Q多l承Qmultiple inheritanceQ。ؓ了承业务类Q又能够使用适配器类Q可以借助内部cL实现?br>卛_其他cȝ内部创徏一个类Q这个内部类l承适配器类。这个内部类不能为程序中其他cL务,从而实现更好地装?/p>
5. W?章的OblongcȝtoStringҎ?br>
public String toString(){ return "Length:"+length+",\t"+"Height:"+height; }
2.
a) Checkable.java
b) BankAccount.java
c) RunAccount.java
d) Oblong.java OblongTester.java
注:length和heigth属性本w就定义为doubleQؓ何还要整数呢Q所以我只考虑了非负的问题?/p>
3. DrawRectangle.java DrawRectangleWithAdapter.java
RunDrawRectangle.java RanDrawRectangleWithAdapter.java
4. SomeGraphicsClass.java // q个cMؓ了给W?题服务,部分代码修改了,有些专属部分攑֜子类中定义?br> Question4.java
5. Question5.java
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
Hostel.java
1. 正确q行
2. Runhostel.java
3. searchButton
注:不太明白什么时候描q关p,可能用来描述的还是业务上的关pR?/p>
2. Z么开发一个通用的ObjectListcR?br>该系l需要开发两U列表,PaymentList和TenantListQؓ了避免重复开发代码,因此开发了一个通用的ObjectListc,
然后通过l承Ҏ分别为PaymentList和TenantListd特定的属性和Ҏ?/p>
3. 在UMLcd中如何记录类的属性?
cd性的语法Q?br>[可见性]属性名[Q类型][=初始值][{属性字W串}]
Q?Q可见性:cM属性的可见性主要包括公有(PublicQ、私有(PrivateQ和受保护(ProtectedQ?br>在UML中,用?”表辑օ有类型,用?”表辄有类型,而用?”表辑֏保护cd。UML的类中不存在默认的可见性,
如果没有昄M一U符PpC没有定义该属性的可见性?br>Q?Q属性名Q每个属性都必须有一个名字以区别于类中的其他属性,是类的一个特性。属性名由描q所属类
的特性的名词或名词短语组成。按照UML的约定,单字属性名写。如果属性名包含多个单词Q这些单词要合ƈQ?br>且除了第一个单词外其余单词的首字母要大写?br>Q?Q类型:说明属性的数据cd。在cȝ图标里,可以指定每个属性值的cd。可能的cd包括字符?br>QstringQ、Q点型QfloatQ、整型(intQ和布尔型(booleanQ,以及其他的枚丄型。指明类型时Q需要在
属性值后面加上类型名Q中间用冒号隔开。还可以为属性指定一个默认倹{?br>Q?Q初始|Z保护pȝ的完整性,防止漏掉取值或被非法的值破坏系l的完整性,可以讑֮属性的初始倹{?br>Q?Q属性字W串Q属性字W串用来指定关于属性的其他信息Q例如,某个属性应该是怹的。Q何希望添?br>在属性定义字W串g又没有合适地方可以加入的规则Q都可以攑֜属性字W串里?/p>
4. 如何改进本章案例研究中开发的应用E序?br>Q?Q用图形化用户界面。下章会完成?br>Q?Q其他可以改的地方太多了Q就不扩展了?/p>
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. PaymentTester.java
2. PaymentTester.java
3. TenantTester.java
4. TenantListTester.java
5. TenantListTester.java
6. ...
Swing: ZAWTcL建?br>几乎所有的lg都用Java~写Q而且所有代码都是SwingE序包的一部分。用Java语言~写的组件称量(Light Weight)lg?br>lg名称都以J开_如JFrame、JButton、JLabel{?/p>
SwingE序包和AWTE序包都是Java基础c?Java Foundation Class, JFC)中的一部分?/p>
补充说明Q首先轻量与重量是一个相对的概念Q主要是对应用框架用方便性和所提供服务Ҏ等斚w做比较的?br>轻量U组仉是纯Java代码开发的Q具有良好的q_UL性,不依赖于操作pȝ的支持,在所有的q_上表CP不直接用操作系l的资源Q?br>当然操作pȝ的资源依然是要占用的Q只是系l资源的理都由lg完成Q用组件的E序员不直接与操作系l的资源打交道?br>重量U组件则每个c都会与操作pȝ中的一个对{资源相对应?/p>
10.4 Java中的事g处理机制(event-handling)
事g处理?event-handler)
自测题:
1。轻量lg与重量lg的不同?br>依赖于本地操作系l的lg被称为重量lgQ因为它们都会大量用系l资源?br>全部使用Java语言~写的组件称量lgQ它们透过AWT使用pȝ资源Q不会直接管理系l资源?/p>
2。布局理器的作用
3。FlowLayout理器与BorderLayout理器的不同
4?br>a) JFramelg的布局{略
b) JPanellg的布局{略
5。一个名为SomeClass的类h两个按钮lgQ这两个按钮lg被按下时会采取特定的动作?br>a) 必要的import语句?br>import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
b) 正确的头部语句?br>public class SomeClass extends JFrame implements ActionListener
c) 创徏按钮需要的Swinglg?br>JButton
d) Ҏ钮监听鼠标单M件?br>button1.addActionListener(this);
e) 哪个Ҏ可以军_鼠标单击按钮旉取行动?br>public void actionPerformed(ActionEvent e)
注: 实现可以参看PushMe.java
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. PushMe.java RunPushMe.java
2. ChangingFacesGUI.java
q个我用的是Swing Designer完成的界面设?手工修改了部分代码,
优点Q比原始版本z?br> ~点Q用了anoynomous classQ本书到q里q没有讲解;q用了enumcdQ也是要C的后面才Ԍq样做就是ؓ了更好的Ҏ学习
3. MetricConverterGUI.java
实现了摄氏温度与华氏温度的{?br> 最后加了两个Panel是ؓ了对齐前面的Panel
4. ReactorTesterGUI.java
也是采用Swing Designer完成的界面设计,q增加了MessageBox的用?br>
补充1QMessageBox需要一个父lgQ而ReactorTesterGUIq没有在构造函C实例化,所以不能用?br> 而能使用的是contentPaneQ这个是在构造函C实例化了Qƈ且在使用之前已经声明了?br> 父组件是Z定MessageBox昄的位|,l果是MessageBox会显C在父组件的中间位置?br>
补充2Q因为ReactorTesterGUI在构造函C是无法实例化的,所以生成的lgq没有直接放在frame的panel中,而是攑֜contentPane中?br> contentPane是在ReactorTesterGUI的类中声明了Q再在构造函C用setContentPane(contentPane)来替换JFrame自己的rootPane?/p>
9.3 可维护?br>pȝl护(maintaining)是指Ҏ需求的变化更新现有pȝ的过E?/p>
9.3.1 装的重要?br>q锁反应Q对pȝ某一部分的改变可能会对系l的其余部分产生影响Q导致系l错误?br>面向对象的封装原则保证了面向蝗程序易于维护,因ؓ装原则减弱了连锁反应的影响Q?br>每个对象都应该在对象内部包含工作的全部细节;所有的数据都应该隐藏在对象内部Q保证对象的M改变都不会媄响到pȝ的其余部分?/p>
9.3.2 文档
在开发面向对象程序的时候,设计文档应该包含以下内容Q?br>* 完整的类?br>* 清晰的方法定义(参数和返回类型,必要时包含伪代码Q?/p>
代码内文档应当包含以下信息:
* 用以描述代码含义的注释信?br>* 有意义的数据名称
* 用常量替换固定的数字
* 一致清晰的~排格式
9.3.3 JavaDoc
常用标签Q@author, @version, @param, @return
9.4 可靠?br>~译旉?compile-time error)Q没有按照语法规则编写合法的E序?br>q行旉?run-time error)Q程序没有完成指定的工作。可能是需求不W,可能是逻辑错误Q或者两者兼而有之?br>试错误Q从单元试开始,然后q行集成试?/p>
9.4.1 单元试(unit testingQ测试独立的c?
不要在原始类中添加mainҎq行试Q而是单独构造一个包含mainҎ的类UCؓ原始cȝ驱动?driver)Q?br>q个驱动器类只是完成对特定类的操作,不会q扰的类?br>如果要进行单元测试的cM赖于其他的类Q而被依赖的类当前无法获得Q那么可以开发一个哑元类(dummy class)用于替换无法获得的类?br>哑元cLZ完成试而开发的模拟真实cȝcR?/p>
9.4.2 集成试(integrating testingQ测试组成应用的所有的c?
在完成程序中每个cȝ独立试后,需要将它们l合Q进行综合测试,目的是保证类之间的接口可以正常地工作?br>Zq行接口试需要对所有类q行重编译。防止类间的接口不一致?/p>
9.4.3 黑盒试(black box testing)
把测试组件看作不透明的盒子,卛_略组件的代码l节Q构造测试的输入数据时可以分成多个等L?/p>
9.4.4 白盒试(white box testing)
把测试组件看作透明的盒子,构造测试集Q尽可能覆盖lg所有可能的执行路径?/p>
9.4.5 试日志
试日志是记录系l开发过E中q行试的文档?/p>
9.5 健壮?br>一个程序意外地l止q行被称为崩?crash)?br>组件推向极限的试ҎUCؓ压力试(stress testing)?br>当违反规则时E序会报告异?exception)Q报告异常的q程UCؓ抛出异常(throwing exception)?/p>
9.6 可用?usability)
E序的可用性是指应用程序的使用者与E序交互q程的容易度?/p>
9.6.1 文本格式?br>转义W:\n, \t, \", \', \\
9.6.2 囑Ş用户界面
?友好的,易于用户操作的?/p>
自测题:
1。解释什么是l承Q?br>l承是指在类之间׃n属性和Ҏ。承关pL一U层ơ关p,也被UCؓa-kind-of关系?/p>
2。在UMLcd中如何描q承关p?
用空心的三角形表C承关p,三角形的指的是基类?/p>
3。在Java中,使用哪个关键字声明一个类是另一个类的子c?
class 子类 extends 基类Q用extends关键字代表承关pR?/p>
4。区分方法重写和Ҏ重蝲的不同?br>多态性的实现Q方法重载和Ҏ重写?br>Ҏ重蝲指同一cM可以存在h相同名称的不同方法,通过它们的参数列表加以区分?br>Ҏ重写指超cM的方法,可以在子cM重写?br>不同的方法的怺区分Q在Ҏ重蝲中通过不同的参数列表相互区分,在方法重写中通过隶属的对象的不同怺区分?/p>
5。解释什么是cd转换Qƈ描述Java中类型{换是如何实现的?br>强制cd转换(typecast)Q强制一个数据从一U数据类型{换ؓ另一U数据类型?br>通过在待转换的数据前加一对含有新cd名称的括号实现?/p>
6。解释abstract和final修饰W分别应用于cdҎ时的作用?br>abstract class表示q个cMؓ抽象c,不能创徏对象Q只能作为其他类的基cR?br>abstract method表示q个Ҏ是抽象方法,没有实现Q子cd果要实例化,必须重写q个Ҏ?br>final class表示q个cMؓ最l类Q不能被l承?br>final method表示q个Ҏ是最l的ҎQ子cM能重写?/p>
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. QualityQ2.java
2. Reactor.java
3. EscapeSequence.java
4. FindCost3.java
b) 说实话,q么单的输出Q真不知道还需要怎样改善信息的布局?nbsp;
8.4 Ҏ重写(method overriding)
多态性的实现Q方法重载和Ҏ重写?br>Ҏ重蝲指同一cM可以存在h相同名称的不同方法,通过它们的参数列表加以区分?br>Ҏ重写指超cM的方法,可以在子cM重写?/p>
不同的方法:在方法重载中通过不同的参数列表相互区分,在方法重写中通过隶属的对象的不同怺区分?/p>
8.5 abstract
抽象c?abstract class)Q不可以创徏其对象,仅能作ؓ创徏其他cȝ基类?br>抽象Ҏ(abstract method)Q强制所有的子类必须实现该方法?br>注:如果子类声明成abstract classQ那么从类l承来的abstract method也可以不实现?/p>
8.6 final
(final class)Q该cM能被l承?br>(final method)Q该Ҏ不能被重写?br>注:(final variable)Q就是常量,与面向对象无兟?/p>
8.8 包装cdautoboxing
对于每个基本cdQJava都有一个对应的c,q个cd数据cd包装其中Q称为包装类?/p>
自测题:
1。解释什么是l承Q?br>l承是指在类之间׃n属性和Ҏ。承关pL一U层ơ关p,也被UCؓa-kind-of关系?/p>
2。在UMLcd中如何描q承关p?
用空心的三角形表C承关p,三角形的指的是基类?/p>
3。在Java中,使用哪个关键字声明一个类是另一个类的子c?
class 子类 extends 基类Q用extends关键字代表承关pR?/p>
4。区分方法重写和Ҏ重蝲的不同?br>多态性的实现Q方法重载和Ҏ重写?br>Ҏ重蝲指同一cM可以存在h相同名称的不同方法,通过它们的参数列表加以区分?br>Ҏ重写指超cM的方法,可以在子cM重写?br>不同的方法的怺区分Q在Ҏ重蝲中通过不同的参数列表相互区分,在方法重写中通过隶属的对象的不同怺区分?/p>
5。解释什么是cd转换Qƈ描述Java中类型{换是如何实现的?br>强制cd转换(typecast)Q强制一个数据从一U数据类型{换ؓ另一U数据类型?br>通过在待转换的数据前加一对含有新cd名称的括号实现?/p>
6。解释abstract和final修饰W分别应用于cdҎ时的作用?br>abstract class表示q个cMؓ抽象c,不能创徏对象Q只能作为其他类的基cR?br>abstract method表示q个Ҏ是抽象方法,没有实现Q子cd果要实例化,必须重写q个Ҏ?br>final class表示q个cMؓ最l类Q不能被l承?br>final method表示q个Ҏ是最l的ҎQ子cM能重写?/p>
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. ExtendedOblong.java ExtendedOblongTester.java
2. Vehicle.java SecondHandVehicle.java
属性的权限Q?br>* public: 属性或Ҏ可以从外部被讉KQ?br>* private: 属性或Ҏ不可以被其他cȝҎ讉KQ只能在cȝ内部被访问,从而实现数据封装?/p>
7.3 static关键?br>声明为static的属性ؓcȝ属性。对该属性的M改变都是对类的对象的改变?br>声明为static的方法ؓcȝҎ。可以不类实例化ؓ对象时就可以讉K?/p>
7.6 传递对象参?br>对象可以作ؓ参数传递,实际上是把对象的引用传递给ҎQ从而可以通过引用修改对象的倹{?/p>
7.7 聚集c?br>包含许多相同cd的数据项时称?collection)cR?br>当一个对象本w又包含其他对象ӞUCؓ聚合关系(aggregation)。聚合关p通常指部分与整体之间的关p,在UML中用I心菱Ş表示?br>l成(composition)是一U更强的聚合关系。通常指整体实际上依赖于部分,在UML中用实心菱Ş表示?/p>
自测题:
1. UML图中Q各部分表示的内容?
{:A是类名;B是属性名U和属性类型;C是方法名U、参数类型和q回值类型?/p>
2。解释public和private在访问属性和Ҏ上的区别?br>{:public属性和Ҏ可以从类的外部访问;private属性和Ҏ只能在类的内部访问?/p>
3。static的作用是什么?
{:static属性表CZؓcȝ属性,可以直接使用cd讉KQ对所有的对象都是共有的?br>staticҎ表示为类的方法,可以不实例化cMؓ对象时就可以讉K?/p>
4。代码输出结?br>{:
20
100
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. Student.java StudentTester.java
2. StockItem.java StockItemTester.java
3. Bank.java BankAccount.java BankProgram.java
4. StudentList.java StudentListTester.java
注:StudentList的UML图中remove(int)和getItem(int)的参数类型不该是int型,搜烦的是学生的学P应该是string?br>5. EasyScanner.java
自测题:
1。如何理解面向对象程序开发的含义QP119
{:面向对象开发技术也可以UCؓ快速应用程序开发技术,因ؓ它允许程序设计h员在分析和设计过E中q稳地过渡?br>此外Q由于封?encapsulation)和信息隐?information-hiding)技术,面向对象技术允许构建更安全的系l?/p>
2。封装的含义是什么?P123
{:在面向对象方法中Q一个类中的Ҏ通常避免直接讉K其他cM的数据,q样不容易对数据造成破坏。这一重要原则被称为封装和信息隐藏?/p>
3。区分类和对象。P121
{:在面向对象方法中Q方法及其操作的数据都聚合在一个单元中。这U更高层的组l单元被UCؓ对象?br>而类是创建对象的模板Q对象是q生成的?/p>
4。构造函数的作用是什么?P123
构造函?constructor)永远与类同名。当创徏一个新对象Ӟq个Ҏ的方法M被调用;该方法的作用是在计算机的存储器中保留_的空间存储需要的对象Q?br>当然q可以完成更多的功能Q例如:初始化变量、申Ll资源等。构造函数可以被重蝲Q因为可以创建需要的构造函数?/p>
5。如何从其他cȝҎ中调用一个类的方法?P126
首先Q需要创建对象,q个q程通常UCؓ实例?instantiation)q程Q因也创Zcȝ一个实例?br>其次Q当初次创徏引用旉常赋空?null)Q空DC没有分配存储空间。需要将实例化的对象的地址赋给引用Q才能正调用对象的Ҏ?/p>
6。对象数l与基本数据cd数组有何区别QP136
基本数据cd数组一旦创建就会随之创建存储过E,而对象数l创建时q没有在存储器中创徏对象数组的存储空_而是创徏了该对象数组的引?Q?br>q且没有具体的对象赋值给引用Ӟ引用默认gؓnull?/p>
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. Olong.java BankAccount.java均在Chap7
2. StringComp.java
3. StringComp.java
4. BankTester.java
1。答QP92
存储固定个数相同数据cd的一l元素?/p>
2。答QP92
所有存储在一个特定数l里的元素必L同一cdQ但是ƈ没有限制是哪一cd。甚臌可以存储对象?/p>
3。答QP104
当满以下几U情冉|能应用增强的for循环Q?br>* 需要访问整个数据(不是数组的一部分Q;
* 需要读取数l中的元素,而不是个性它们;
* 不需要用数l完成其他处理过E?/p>
4。答Q?br>a) someArray.length的值是5Q?br>b) someArray[2]的值是1
c) 如果讉KsomeArray[6]Q程序会报错Q超出数l的索引边界Q?/p>
d)
int[] someArray=new int[5];
someArray[0]=2;
someArray[1]=5;
someArray[2]=1;
someArray[3]=9;
someArray[4]=11;
e)
for (int i=0;i<5;i++)
{someArray[i]=someArray[i]*2;}
f)因ؓ需要修Ҏl中的|增加for循环不能实现修改数组的需求?/p>
5。答Q?br>a)
private static int[] getExamMarks()
{
Scanner sc=new Scanner(System.in);
System.out.println("Please input the student number: ");
int studentNumber=sc.nextInt();
int[] students=new int[studentNumber];
for (int i=0;i<studentNumber;i++){
System.out.println("Plase input "+(i+1)+" student mark: ");
students[i]=sc.nextInt();
}
return students;
}
b)
private static void increaseMarks(int[] studentsIn) {
for (int i = 0; i < studentsIn.length; i++) {
studentsIn[i] = studentsIn[i] + 5;
}
}
c)
private static boolean allHavePassed(int[] studentsIn){
boolean result=true;
for (int item:studentsIn)
{
result=result&&(item>40);
}
return result;
}
~程l习Q?a href="http://m.tkk7.com/Files/zhuyuanxiang/JavaInTwoSemesters.zip">代码附g
1. TemperatureReadings3.java
2. Lottery.java
3. ExchangeRate.java
4. ExchangeRate.java
5. SomeUsefulArrayMethods.java