??xml version="1.0" encoding="utf-8" standalone="yes"?> 从这些课E中Q你可以学到很多|页设计相关知识。在你了解这些知识好处之前,你会p计ƈ发布|站Q或为客h建网站。随着时光逝,当你需要一门复习课E,或者当你准备更C的网设计技能时Q你也必定能扑ֈ更多的开放课件?br />
而在念书的时候,虽然上大学之前,有不内行的外行的,q老的q轻的h告诉你,数学很重要啊。但是,通常来说Q各个学校的计算机系的同学么Q爱好学习的Q可能重视的也是Thinking in JavaQC++ Primer之类的语a书,或者设计模式之cȝ架构书,抑或是算法与数据l构q些玩意儿;而像我这样天天偷懒放的Q也不会把数学当作是什么重要的评好好学习。所以,“数学真重?#8221;Q这句话Q似乎对于大家来_始终只是飘在天上的一句话Q随风飘逝了?/p>
于是Q五q过MQ程序员们都有了不少的工作经验了Q如果不是对工作毫无q求混吃{死的程序员的话Q对于天天干zȝ语言Q不论是Javaq是C++应该都熟能生巧了Q所谓的设计模式、重构、自动化试{等也手到擒来了Q大部分人的title上都加上了Senior了,牛一点的后面大概q跟上了一个ManagerQ然而,大家都开始考虑一个新的问题—?#8220;30岁以后怎么半?”Q于是,转PM的{PMQ考公务员的考公务员Q像我这样仍然抱定—?#8220;你看人家国Rohit?0了还不是天天写程序,别h惌q请不到?#8221;的单U想法的来越了。然后,qq些人,时不时也会觉得,自己天天q的越CRUD的,所谓写点OO的框Ӟ不也是很无聊的体力活么,写程序的人干两年谁都会干。于是,又有不少Z创业了Q多q以后,q些Z的大部分都会和我一h催的没有挣到前l回来给大大小的公司写E序?/p>
其实Q杯具往往发生在一开始,其实Q要是咱们当q好好学习,才会发现Q也许数学对于你当个不错的程序员来说Q没那么重要Q但是要再往上走一步,有一点点技术上的创斎ͼ都是数学的事儿了。两q前Q我在T公司Q用Configurator处理某个E序的时候,开始有点儿意识到这一点了Q于是,那阵子还׃不少旉重新ML理逻辑。今q_换了新工作后Z工作看点儿机器学习的东西的时候,l于发现Q这全都是数学啊。当你要越CRUDQ做M一点点有创新性的技术的时候(不说产品Q,最有机会遇到的问题Q其实是数学问题。虽然从Spring到Hibernate到Rails之类的框Ӟ或者HadoopQHBase之类的分布式计算框架Q也都是技术上的重大革斎ͼ但是q些框架cȝE序Q完善都是阶D|的Q一旦出现后Q很快都会有相应的Best PracticeQ又会成为熟l工U的zR而真正针寚w题域的解{,反是每天都可以有些新鲜的x、思\和方案的Q这些,往往有个数学的门槛。所以如果你真是挺喜Ƣ写E序的,而且希望自己一直能写更好玩更难的程序,L一天,你要q了q一道坎ѝ?/p>
所以我很是同意不知道是谁说得,如果你只惛_个good programmerQ那么数学不重要。但是如果你惛_个great programmerQ那么数学很重要。在你手里只有锤子的时候,你看什么东襉K会是个钉子,x你如果没有学q算法和数据l构Q可能你的大部分E序需要自己写排序的话Q都会是d地冒泡吧Q反正对于大部分E序来说Q在现在q么快的PC下,q点旉差别Q大部分情况下,也就是让你等E序执行试的时候,多个倒杯水的旉。但是很多新鲜,好玩Q有挑战的问题,很多数学的概忉|有的话,恐怕不是多{个倒水的时间了。而如果你q了q个门槛Q你又会发现Q一个崭新的世界Q又C你的面前?/p>
回过头来Q我说数学重要的话,那么重要的是哪些呢?大家常说的通常是离散数学,不过最q比较热门的机器学习q个方向Q我目前看到的相兌料都大量依赖于线性代数和概率论,以及一点点微积分。所以,如果你和我一P希望做点有追求的技术工作的话,开始花Ҏ间学习数学吧。其实万事开头难Q也怽和我一P对着一堆公式符P感到头晕DQ但是如果真得按下心来,看上一个小Ӟq么坚持个一周,其实׃发现Q这没啥隄Q就当学门新的编E语a得了?/p>
本文链接Q?a target="_blank">http://www.jobbole.com/entry.php/365
ViaQ?a rel="nofollow" target="_blank">Webdesigncolleges 文章推荐Q关兟뀀 ~译Q伯乐在U?敏捷译l?br />
如需转蝲Q请注明文章来源和超链接{版权信息,否则视ؓ侉|Q谢谢合作!
]]>
]]>
一、判断题Q正的描述打钩Q错误的打叉Q每?1 分,?10 分)
1. 一?Java 源文件中只能定义一个公有类Qƈ且类名必M文g名一致。(对)
2. 通过在程序中引入“ import javax.swing.*; ”语句Q就可以使用 javax.swing 包中的所有类Q包括其嵌套的子包中的类Q?nbsp; Q错Q?
要用嵌套子包中的类Q必dơ添?import 子句
3. J2SE 的功能是 J 2 ME 的一个子集。(错)
4. Java 字节码只有被装入到内存中之后Q才能被执行。(对)
在当前计机体系l构之下QCPU无法直接d保存于磁盘上的程序文Ӟq些文g所包容的指令必被装入到内存之后,CPU才能d?
5. Swing是一套GUIlgQ采用了新的思\设计Java应用E序的界面,它完全地替换掉了原有的AWT。(错)
Swing仍然使用AWT的事件模型,q完全抛弃?
值得注意的NetBeans 6.9.1完成最新的更新lg?创徏Java桌面应用E序Ӟ有了一个新的提C消息框Q?
看来Oracle也知道Java在桌面上没戏Q干脆放弃了对Swing框架的进一步开发。已l存在这么多q的Swing框架?#8220;C?#8221;抛弃Q真不知道该说什么?
6. 在编E时~写q多的注释,会ɾ~译之后生成的程序文件变大。(错)
攑ֿQ?~译器会删除所有的注释。所以,哪怕你在程序中写了一部长小_也不会拖慢程序的q行速度?
7. Java Applet 可运行于览器中Q这意味着览器本w就可以直接执行 Applet E序。(错)
览器本w只认识HTMLQ它对其他类型信息的支持Q比如FlashQAppletQSilverlight应用E序{都是通过启动本地计算机安装的附加插g来实现的?
8. JDK 5.0新增的枚丄型( enum Q是一个原始数据类型。(错)
9. Java 中规定所有的Ҏ都必L到某个类中,不存在独立于cȝҎ。(对)
10. 面向对象软gpȝ设计师们l常用到?UML 是一U编E语a。(错)
二、简{题Q请答案写到答题纸上,注明题号。每?4 分,?40 分)
1. C~程语言有两U主要的cdQ一U是“~译?”的,比如 C Q程序源码必ȝq编译才能运行;另一U是“解释?”的,q种cd的语aQ比如早期的 Basic Q通常都拥有一个交互环境,用户输入一句代码计机执行一句代码?
Java 属于上述哪种cdQ如果你认ؓ Java 不属于上qCQ何一U类型,那么它是不是一U新的编E语acdQ?
Java源程序需要编译,但运行时需要即?#8220;解释”为本地CPU能执行的机器指oQ所以它不属?#8220;U?#8221;的编译型或解释型Q而是一U合类型?
有的同学?#8220;l?#8221;Q他_“Java是一U面向对象类型的~程语言”。这句话q真是对的,我也l了分?
2. Java 中有两个关键字: void ?null Q它们有什么区别?
q题100%的学生都能答对,Ua是送分题?
3. q?#8220;c(ClassQ?#8221;?#8220;cd(Class Library)”?#8220;包(PackageQ?#8221;?#8220; Jar 文g”q四个概念间的联pR?
cd其实是一?#8220;l称”Q它是类的集合。包则是cd的组lŞ式,它类gC++中的namespaceQ可以解决类的同名问题?
Jar则是一个采用Zip格式压羃的文件包 Q主要是Z方便Javalg的复用,化Java应用E序的部|和发布。Jar包中可以保存Lcd的多个文件和多嵌套?br />
文g夏V比如JDK包容了不少Jar压羃包,你可以用解压羃工具(比如WinRAR)L看它的内宏V可以把Jar文g看成是Javacd的一个物?#8220;载体”Q之所以称
其ؓ“物理”的,是因为我们可以在计算Z直接“看见”q?#8220;操作”它?
在学习和探烦知识的过E中Q有的时候就必须注意清晰地分清各个似是而非的概念,q道题有好几个同学就把这几个概念间的关系弄ؕ了?
4. 面向对象的程序在q行时会创徏多个对象Q这些对象之间通常可以怺 “ 发送消?” Q谈谈你?“ 对象之间发送消?” q句话的理解Qƈ~写若干
句示例代码展C对象之间发送消息的具体~程实现Ҏ?
对象间的消息发送最基本的手D就是:一个对象执有另一个对象的引用Q然后,通这个对象引用调用对方的ҎQ存取对方的字段Q或属性)?
对象互发消息Q其本质目的是Z交换信息?
除了上述q两U直接方式之外,我们q可以通过一些第三方的媒h实现对象间的信息交换Q比如利用类的静态字D,利用内存映射文gQ利用数据库Q利?br />
外部׃n?#8220;物理”文g{?
我在?NET 4.0面向对象~程漫谈 》的W?4章《对象间的协作与信息交换》中介绍了七八种单个、多个对象间消息发送和信息交换的方式,虽然是用C#实现
的,但其思想完全可用于Java中?
掌握q些~程技巧,对开发非常关键?
5. 加法q算W?#8220;+”可以施加于原始数值类型(比如 int Q的变量Q但我们发现一些对象类型(比如 Integer Q?的变量,也支?#8220;+”q算Q?
Integer v1 = 100;
Integer v2 = 200;
System.out.println(v1+v2 ); //输出Q?300
q看上去好象 Integer cd重蝲?“ + ” 法运符Q一些编E语a比如 C ++可以为特定的c重载运符Q但 Java 本nq不支持q算W重载这一Ҏ。依你的
理解或猜, Java 是采用什么方法让两个 Integer 对象可以直接“相加”的?
上面代码首先是调用Integer.valueOfҎ整数{换ؓInteger对象Q当两个Integer对象相加Ӟ其实是用Integer.intValueҎ取出其所“包装”的整数|相加?br />
后,再将l果输出?
上述l论是通过分析javap反汇~示例代码得到的?
诸如Java和C#之类的编E语aQ许多现象已不仅仅是语法问题Q编译器在其中v了很重要的作用。我在课堂上已经介绍q如何用javapd汇编.class文gQ?br />
q阅读Java~译器生成的字节码指令去弄明白java~译器在后台玩的把戏?
q道题主要是引导学生学编E语a不要仅学语法Q要学会利用工具透过表面现象看本质?
有的学生猜测Java可能是设计了另外的对象负责完?#8220;+”q算Q虽然与Java实际情况不符Q但q个思\是可行的Q我同样l分?
6. 在一个很大的循环Q比如@?0000000 ơ)中,如果需要进行字串的q接操作Q通常我们者用StringBuffer 取代String Q解释这么做的理由?
l大部分同学都答对了。但有的同学_在大循环中用StringQ会“费”大量的内存,q句话是不准的Q因为Java有一个垃圾收集机Ӟ在合适的时机?br />
出来回收不用的String对象Q因此,q些内存不能说是?#8220;费”的,我们唯一可以说的是:
׃String对象是只ȝQ用它大量字串q接操作Q将D频繁的内存分配操?Q这会严重地影响E序性能?
7. 现有两个长度不同的数l:
int[] arr1 = new int[10];
int[] arr2 = new int[100];
那么以下语句能通过~译吗?
arr1 = arr2;
如果你认为可以通过~译Q得到这个结论的依据是什么?如果不能通过~译Q你认ؓ其原因是什么?
可以通过~译。此题考核学生知不知道 Java 中的数组属于对象cdQ知不知道对象变量相互赋值的含义?
8. L以下代码 Q?
double d1=100.1;
double d2=1001/10;
System.out.println(d1==d2); // 输出 Q?false
明明 d1 ?d2 是相{的 Q?Z么程序运行时会输Z个让人意外的l果 Q?false Q?
很多同学都指?001/10 其实?#8220;整除”Q得?00 Q再转ؓdouble Q所以d2=100.0 Q自然d1==d2 q回false 了?
׃我在译֠上曾展示q计机难于_表示双精度数Q比较两个double 变量是否相等应该其差的l对值是否在某个可以容忍的误差范围内Q所以几个同
学就往q个思\上去想了?
对这U情况,我没扣分?
9. 当用多?catch 语句捕获多个异常Ӟ Java 规定捕获 Exception ?catch 语句必须排在最后,如下所C:
try { …… }
catch(ClassCastException ex){…… }
catch(NumberFormatException ex){…… }
catch(Exception ex){ …… } // 此句必须攑֜最后!
Z么会有这个限Ӟ谈谈你是怎么理解的?
学生们几?100% {对此题Q由?Exception 是顶层类Q放到前面会D后面?catch 语句不可能有Zq行?
10. L以下CZ代码Q?
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // 输出Q?true
String s3 = new String("Hello");
String s4 = new String("Hello");
System.out.println(s3 == s4); // 输出Q?false
误释一下ؓ什么上qC码中 “ System.out …” 两句代码输出完全不同的结?Q?
q里面的关键在于 Java 帔R池?JVM 在装载一?.class 文gӞ会在内存中创Z个常量池?
“ Hello ”是字W串帔RQ?Java ~译器会?#8220; Hello ”攑ֈ帔R池中Qƈl它一个烦引:
const #28 = Asciz Hello;
以下两句代码Q?
String s1 = "Hello";
String s2 = "Hello";
生成以下的字节码指令:
0: ldc #2; //String Hello
2: astore_1
3: ldc #2; //String Hello
5: astore_2
上面?#2 代表帔R池中的第 2 :
const #2 = String #28; // Hello
注意它引用常量池的第 28 ,前面已经看到Q第 28 就是一?#8220; Hello ”字符串对象?
astore 指o常量池中同一?#8220; Hello ”字符串对象的地址赋给?s1 ?s2 Q所以, s1==s2 肯定q回 true ?
下面来看一下:
String s3 = new String("Hello");
所生成的字节码指oQ?
// 创徏 String 对象Q对象引用被 Push 到操作数堆栈Q?operand stack Q?
// 帔R池的W?5 Ҏ向一?CONSTANT_Class_info cd的表,q个表项引?String cd
// 在程序运行时Q会D JVM 装蝲q连?String cd信息
22: new #5; //class java/lang/String
25: dup // 复制对象引用Q再ơ压入操作数堆栈Q此复制的对象引用将用于调用构造函?
26: ldc #2; //String Hello 装蝲帔R“ Hello ”
28: invokespecial #6;
//Methodjava/lang/String."<init>":(Ljava/lang/String;)V
// 调用 String cȝ构造函敎ͼ它从操作数堆栈提取信息初始化 String 对象
31: astore_3 // 创建好的对象引用保存到 s3 ?
从上q分析可以清晰地看到Q?s3 ?s4 都引用不同的对象。所以, s3==s4 q回 fasle ?
现在Q同学们?JVM 的认识是不是更深入了一步?
现在 Java E序?#8220;遍地”都是Q但其中高水q的不多Qؓ什么?
一个很重要的原因就是浅辄止,仅记住了一些语法结论,却从不主动地L索一下代码背后的奥秘Q怎会有提高?
我很早就在课堂上展示?javap 的用方法,q向同学们推荐了那本l典的?Inside the Java Virtual Machine 》,但我估计׃课业负担重,没几个同学真?br />
ȝ了这本书Q对此,我只能一声叹息?
多问几个Z么,对事物刨栚w底,q其实不是在学习Q而是在探索了Q这个过E中Q你的能力会得到不断地锻炼和提高?
另外我要指出Q同L学习Ҏ可以直接?.NET 领域Q比?.NET 有一?ildasm 可以直接查看 .NET E序集( .exe ?.dll Q等价于 Java 中的 .class Q中
?IL 指oQ对应于 Java 字节码指令)Q有一?Reflector 工具可以很方便地反汇~查看Q意一个程序集的源码,对应圎ͼ .NET 虚拟机—?CLR Q也?JVM
有许多相g处?
我在写作?.NET 4.0 面向对象~程漫谈》时Q就通过直接查看E序集的 IL 指o代码Q弄清楚了不东西,也加׃对语a~译器和虚拟机的认识?
?Java ?.NET q种非常相近的^収ͼ下功夫弄清楚一个,你会发现学习与掌握另一个ƈ不困难。计机有很多东西是盔R的。关键不在于学什么东西,
而是是否掌握了学习的U学ҎQƈ且有一U不断学习、勇于探索未知的_。具备这U基本素质的学生Q我怿他日后的发展应该不会差的?
错误提示Q?/strong>
严重: Error initializing endpoint
java.net.BindException: Address already in use: JVM_Bind:80
at org.apache.tomcat.util.net.PoolTcpEndpoint.initEndpoint(PoolTcpEndpoint.java:258)
at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:143)
at org.apache.coyote.tomcat5.CoyoteConnector.initialize(CoyoteConnector.java:1402)
at org.apache.catalina.core.StandardService.initialize(StandardService.java:605)
at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:2369)
at org.apache.catalina.startup.Catalina.load(Catalina.java:507)
at org.apache.catalina.startup.Catalina.load(Catalina.java:528)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:247)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:421)
2006-2-8 16:36:37 org.apache.catalina.startup.Catalina load
严重: Catalina.start
LifecycleException: Protocol handler initialization failed: java.net.BindException: Address already in use: JVM_Bind:80
at org.apache.coyote.tomcat5.CoyoteConnector.initialize(CoyoteConnector.java:1404)
at org.apache.catalina.core.StandardService.initialize(StandardService.java:605)
at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:2369)
at org.apache.catalina.startup.Catalina.load(Catalina.java:507)
.......................
原因分析Q?/strong>在dos下运?#8220;netstat -a ”查看当前端口的用情c?/p>
解决ҎQ?/strong>修改Tomcat的用端口,具体做法——找到目?..\Tomcat 5.0\confQ在conf目录下有“server.xml”文gQ用C本打开此文Ӟ查找Q打开文g后Ctrl+FQ文件中的所?#8220;8080”Qƈ改ؓ其他没有被占用的端口|如:8088?081{)?/p>
]]>