一个语言的诞生有其目的,因为这个目的而成就了语言的主要特性,探索Java的历史演进,对于掌握Java特性与各式可用资源,着实有其帮助。
从1995年至今,Java已经超过15个年头,经过这些年的演进,Java已不仅是个程序语言,也代表了解决问题的平台(Platform),更代表了原厂、各个厂商、社群、开发者与用户沟通的成果。若仅以程序语言的角度来看待Java,正如冰山一角,你仅看到Java身为程序语言的一部分,而没看到Java身为程序语言之外,更可贵也更为庞大的资源。
java不仅是程序语言,还是标准规范,每个标准代表着厂商面临的问题,代表着解决问题的方案,也因此,学习Java,就等于在面临各式问题如何解决,然而,这么多的问题,衍生出如此多的解决方案,也因此对于初学Java的人,如同面临满载产品的庞大货轮,不知从何开始,也不知将来何去何从。
| 如果程序语言被比喻为一艘船,JAVA语言会是如何呢? Java是一个货船,它非常庞大。它可以比喻为一个企业~因为它可以携带大量的重量,他/她将带动一个庞大的项目,然而事件都是有两面性,遗憾的是货船可能没有更多的驾驶乐趣。 |
在Java的官方网站提供有一份Java技术观念地图(Java Technology Concept Map)的文件
Java技术观念地图
在这份文件中,密密麻麻地列出了大部分Java相关地图与简要说明,也代表了Java技术范畴的广泛,然而要从这么庞大的地图中找出一条适合初学Java的路线图绝非易事。以下是我基于经验与教学建议的学习路径。
1. 深入了解JVM/JRE/JDK
许多书籍对于JVM/JRE/JDK的说明,通常以极短的篇幅介绍,就是在短短几页中,请使用者依书中步骤安装与设定PATH、CLASSPATH后,就开始介绍Java程序语言,而许多人到了业界后就开始使用IDE(Integrated Development Environment)代劳所有JDK细节。这么做的结果就是,在IDE中遇到与JDK相关的问题,就完全不知道如何解决。
JVM/JRE/JDK并不是用短短几页就可以说明,若没有“JVM是Java程序唯一认识的操作系统,其可执行文件为.class文档”的重要观念,就无法理解PATH与CLASSPATH并非同一层级的环境变量,JDK中许多指令与选项,其实都可以对应至IDE中某个设定与操作,你对JVM/JRE/JDK有足够的认识,对IDE中相关选项就不会有疑问,也不会换个IDE就不
知所适,或没有IDE就无法撰写程序。
2. 理解封装、继承、多态
对于Java程序语言,if...else、for、while、switch等流程语法早已是必须熟练的基础,更重要的是,Java支持面向对象(Object Oriented),你必须理解面向对象中最重要的封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)概念,以及如何用Java相关语法来实现。
许多人撰写Java程序,并没有善用其支持面向对象的特性,问到何谓封装而无法回答(甚至回答定义类即为封装),滥用Java继承语法,不懂多态而不知如何运用API文件(更别说运用多态设计程序了),最后的结果就是沦于死背API文件、使用“复制、粘贴”大法来撰写程序,整个应用程序架构杂乱无章而难以维护。
3. 掌握常用Java SE API架构
Java并非只是程序语言,还带有庞大的各式链接库(Library),对初学者而言,首要是掌握常用的Java SE API,像是异常(Exception)、集合(Collection)、输入/输出串流(Stream)、线程(Thread)等。学习这些标准API,绝不要沦于死背,应先掌握API在设计时的封装、继承、多态架构。以Collection为例,在学习时必须先理解为何要设计为图的架构。
Collection API架构范例
学习相关链接库或API,先理解主要架构绝对是必要的,这样才不会沦于死背API或抄写范例的窘境。更进一步地,还可以从API中学习到良好设计的观念,有了这样的好习惯,以后对新的API或链接库就能更快掌握如何使用甚至改进。
4.学习容器观念
在步入Java EE领域之后,经常接触到容器(Container)的观念,许多人完全以API层次来使用Java EE相关组件,这是不对的。容器就操作层面来说,就是执行于JVM上的Java应用程序,从抽象层面来说,就是你的应用程序沟通、协调相关资源的系统。
初次接触容器的开发人员会觉得容器很抽象。以实际的例子来说,通常初学者步入Java EE,会从学习Servlet/JSP开始,而Servlet/JSP是执行于Web容器之中,这是学习容器观念时不错的开始,你必须知道“Web容器是Servlet/JSP唯一认识的HTTP服务器,是使用Java撰写的应用程序,运行于JVM之上”,如果希望用Servlet/JSP撰写的Web应用程序可以正常运作,就必须知道Servlet/JSP如何与Web容器沟通,Web容器如何管理Servlet/JSP的各种对象等问题。
关于Servlet/JSP的说明,可参考我撰写的《JSP & Servlet学习笔记(第2版)》(清华大学出版社),或是Servlet/JSP在线文件: http://caterpillar.onlyfun.net/Gossip/ServletJSP/ |
容器的观念无所不在,Applet会执行于Applet容器中,因此相关资源受到Applet容器的管理与限制,Servlet/JSP执行于Web容器中,EJB执行于EJB容器中,Java应用程序客户端执行于应用程序客户端容器中,如图所示。不理解组件如何与容器互动,就无法真正使用或理解组件的行为。
摘自
5. 研究开放原始码项目
Java不仅是程序语言,也是个标准,在共同标准下有不同的运行方式,在Java领域的许多操作都是以开放原始码的方式存在,只要你有兴趣,可以下载原始码了解运行方式,从中了解甚至吸收他人设计、实现产品的技巧或理念。
许多基于Java各标准平台发展出来的产品也值得研究,如测试框架(Framework)、Web框架、持久层(Persistance)框架、对象管理容器等,这些产品补足标准未涵盖之处,各有其设计上优秀与精良之处,有些更进而回馈至Java而成为标准之一,重点是它们也多以开放原始码的方式存在,让开发人员可以使用、研究甚至参与改进。
6. 学习设计模式与重构
在程序设计上,“经验”是最重要的,在经验传承上,归纳而言,无非就是“如何根据需求做出好的设计”、“如何因应需求变化调整现有程序架构”,对于前者,流传下来的设计经验就是设计模式(Design pattern),对于后者,流传下来的调整手法就是重构(Refactor)。
“如果我当初就这么设计,现在就不会发生这个问题了!”这种对话应该很熟悉,“当初就这么设计”就是所谓设计模式。“如果我当初先这么改,再那么改,就不会把程序改到烂了!”这种对话也经常听到,“当初先这么改,再那么改”就是所谓重构。
无论好的设计还是不好的设计,都要有经验传承。经验可以口耳相传,可以从原始码中观摩,也可以从书籍或网络上优秀的技术文件中学得。对于初学者,从书籍或网络上优秀的技术文件学习设计模式与重构,是积累经验的快捷方式。
7. 熟悉相关开发工具
除了累积足够的实力与基础,善用工具是必要的,开发工具可以避免烦琐的指令、减少重复性的操作、提示可用的API、自动产生程序代码、降低错误的发生,甚至执行各种自动化的测试、报告产生与发送邮件等任务。有些开发人员鄙视开发工具,这是不必要的,两个实力相同的开发人员撰写相同的应用程序,使用良好开发工具的人必然有较好的效率。
在Java领域难能可贵的,是存在不少优秀的开发工具,而且多以开放架构、开放原始码的方式存在,如Eclipse IDE、NetBeans IDE都是相当不错的选择。还可以搭配Ant构建工具、Maven项目工具等一同使用,大大地提升开发人员的产能。
建议初学Java的人,可以挑选一种开发工具来熟悉。所谓熟悉,不是指“下一步要按哪个按钮、接下来要执行哪个菜单”,而是指这些开发工具相关操作,是为了代劳你手动执行哪些指令,开发工具中的某些选项,是为了代劳你设定哪些变量,错误提示原本是来自JDK的什么信息等。以这样的过程来熟悉开发工具,才能善用开发工具提升产能,而不是受制于开发工具,这样就算换了另一套开发工具,也可以在最短时间内上手。
以上内容是基于我的新作《Java Jdk7学习笔记》历时5年 2012年全新升级,希望能给学习JAVA的朋友一些建议。
下面这份导读让你可以更了解如何使用本书。
字型
本书正文中与程序代码相关的文字,都用固定大小字体来加以呈现,以与一般名词相区别。例如,JDK是一般名词,而String为程序代码相关文字,使用了固定大小字体。
程序范例
本书许多的范例都使用完整程序操作来展现,当看到以下程序代码示范时:
ClassObject Guess.java
package cc.openhome;
u 告诉编译程序接下来想偷懒 |
importjava.util.Scanner;
public class Guess {
publicstatic void main(String[] args) {
v 建立Scanner实例 |
Scanner scanner = newScanner(System.in);
int number = (int) (Math.random() * 10);
int guess;
do{
System.out.print("猜数字(0 ~ 9):");
w 取得下一个整数 |
guess = scanner.nextInt();
}while(guess != number);
System.out.println("猜中了...XD");
}
}
范例开始的左边名称为ClassObject,表示可以在书附光盘的samples文件夹的各章节文件夹中找到对应的ClassObject项目,而右边名称为Guess.java,表示可以在项目中找到Guess.java文件。如果程序代码中出现标号与提示文字,表示后续的正文中,会有对应于标号及提示的更详细说明。
原则上,建议每个项目范例都亲手动作撰写,但如果由于教学时间或操作时间上的考虑,本书有建议进行的练习。如果在范例开始前有个图标,例如:
Game1 SwordsMan.java
package cc.openhome;
public class SwordsMan extends Role {
publicvoid fight() {
System.out.println("挥剑攻击");
}
}
表示建议范例动手操作,而且在书附光盘的labs文件夹中会有练习项目的基础,可以打开项目后,完成项目中遗漏或必须补齐的程序代码或设定。
如果使用以下的程序代码呈现,表示它是一个完整的程序内容,但不是项目的一部分,主要用来展现一个完整文档如何撰写:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello!World!");
}
}
如果使用以下的程序代码,则表示它是个代码段,主要展现程序撰写时需要特别注意的片段:
SwordsMan swordsMan = new SwordsMan();
...
System.out.printf("剑士 (%s, %d, %d)%n", swordsMan.getName(),
swordsMan.getLevel(), swordsMan.getBlood());
Magician magician = new Magician();
...
System.out.printf("魔法师 (%s, %d, %d)%n", magician.getName(),
magician.getLevel(), magician.getBlood());
操作步骤
本书将IDE进行设定的相关操作步骤也作为练习的一部分,你会看到如下的操作步骤说明:
(1) 选择“文件”|“新建项目”命令,在弹出的“新建项目”对话框的“类别”列表中选择Java,在“项目”列表中选择“Java应用程序”,接着单击“下一步”按钮。
(2) 在“项目名称”文本框中输入项目名称Hello2,在“项目位置”文本框中输入C:\workspace。注意,“项目文件夹”会储存至C:\workspace\Hello2。
(3) 在“创建主类”文本框中输入cc.openhome.Main,这表示会有个Main类放在cc.openhome包,当中会自动建立main()程序进入点的方法,接着单击“完成”按钮建立项目。
如果操作步骤旁有个图标,表示书附光盘的videos文件夹中对应的章节文件夹有操作步骤的视频,可观看它以更了解实际操作过程。
本书针对JDK7全新改版,如果发现页侧有图标,表示是JDK7的新功能,本书亦提供有JDK7新功能快速查询目录。
提示框
在本书中会出现以下提示框:
针对课程中所提到的观点,提供一些额外的资源或思考方向,暂时忽略这些提示对课程进行并没有影响,但有时间的话,针对这些提示做阅读、思考或讨论是有帮助的。
针对课程中所提到的观点,以提示框方式特别呈现出必须注意的一些使用方式、陷阱或避开问题的方法,看到这个提示框时请集中精神阅读。
附录
书附光盘包括本书中所有范例,提供NetBeans范例项目,附录A说明如何使用这些范例项目,本书也说明了如何使用JDBC操作数据库,操作范例时使用的数据库为MySQL,附录B包括MySQL的入门简介。
关于认证
本书涵盖了Oracle Certified Professional, Java SE Programmer考试范围,也就是原Sun Certified Java Programmer(SCJP),不过11.2节之后不在考试范围,而是为了Java SE相关技术范围完整性而做介绍。
关于Java认证介绍,建议直接参考Oracle University网站上的认证介绍:
http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id
=140
每章最后都会有“重点复习”,为针对该章的重要提示,可作为考前复习时使用。
作者:林信良出版社:清华大学出版社 ISBN:9787302282082上架时间:2012-5-1出版日期:2012 年5月开本:16开页码:562版次:1-1
图书预售:
互动网:
当当网: