真正的java从入门到精通。

时间:2021-11-13 00:36:51
 
一、 工具篇 JDK (Java Development Kit)

JDK
是整个 Java 的核心,包括了 Java 运行环境( Java Runtime Envirnment ),一堆 Java 工具和 Java 基础的类库 (rt.jar) 。不论什么 Java 应用服务器实质都是内置了某个版本的 JDK 。因此掌握 JDK 是学好 Java 的第一步。最主流的 JDK Sun 公司发布的 JDK ,除了 Sun 之外,还有很多公司和组织都开发了自己的 JDK ,例如 IBM 公司开发的 JDK BEA 公司的 Jrocket ,还有 GNU 组织开发的 JDK 等等。其中 IBM JDK 包含的 JVM Java Virtual Machine )运行效率要比 Sun JDK 包含的 JVM 高出许多。而专门运行在 x86 平台的 Jrocket 在服务端运行效率也要比 Sun JDK 好很多。但不管怎么说,我们还是需要先把 Sun JDK 掌握好。

1
JDK 的下载和安装

JDK
又叫做 J2SE Java2 SDK Standard Edition ),可以从 Sun Java 网站上下载到, http://java.sun.com/j2se/downloads.html JDK 当前最新的版本是 J2SDK1.4.2 ,建议下载该版本的 JDK ,下载页面在这里: http://java.sun.com/j2se/1.4.2/download.html 。下载好的 JDK 是一个可执行安装程序,默认安装完毕后会在 C:/Program Files/Java/ 目录下安装一套 JRE (供浏览器来使用),在 C:/j2sdk1.4.2 下安装一套 JDK (也包括一套 JRE )。然后我们需要在环境变量 PATH 的最前面增加 java 的路径 C:/j2sdk1.4.2/bin 。这样 JDK 就安装好了。

2
JDK 的命令工具

JDK
的最重要命令行工具:


java
启动 JVM 执行 class
javac
Java 编译器
jar
Java 打包工具
javadoc
Java 文档生成器




这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习, JDK Documentation 上有详细的文档。

二、 JDK Documentation

Documentation
JDK 的下载页面也有下载连接,建议同时下载 Documentation Documentation 是最最重要的编程手册,涵盖了整个 Java 所有方面的内容的描述。可以这样说,学习 Java 编程,大部分时间都是花在看这个 Documentation 上面的。我是随身携带的,写 Java 代码的时候,随时查看,须臾不离手。

三、 应用服务器 (App Server)



App Server
是运行 Java 企业组件的平台,构成了应用软件的主要运行环境。当前主流的 App Server BEA 公司的 Weblogic Server IBM 公司的 Websphere 以及免费的 Jboss ,选择其中一个进行学习就可以了,个人推荐 Weblogic ,因为它的体系结构更加干净,开发和部署更加方便,是 Java 企业软件开发人员首选的开发平台。下面简要介绍几种常用的 App Server

1
Tomcat

Tomcat
严格意义上并不是一个真正的 App Server ,它只是一个可以支持运行 Serlvet/JSP Web 容器,不过 Tomcat 也扩展了一些 App Server 的功能,如 JNDI ,数据库连接池,用户事务处理等等。 Tomcat 被非常广泛的应用在中小规模的 Java Web 应用中,因此本文做一点下载、安装和配置 Tomcat 的介绍: Tomcat Apache 组织下 Jakarta 项目下的一个子项目,它的主网站是: http://jakarta.apache.org/tomcat/ Tomcat 最新版本是 Tomcat4.1.27 ,软件下载的连接是: http://www.apache.org/dist/jakarta/tomcat-4/binaries/

下载 Tomcat 既可以直接下载 zip 包,也可以下载 exe 安装包(个人建议 zip 更干净些),不管哪种情况,下载完毕安装好以后( zip 直接解压缩就可以了)。需要设置两个环境变量:


JAVA_HOME=C:/j2sdk1.4.2
CATALINA_HOME=D:/tomcat4 (
你的 Tomcat 安装目录 )




这样就安装好了,启动 Tomcat 运行 CATALINA_HOME/bin/startup.bat ,关闭 Tomcat 运行 shutdown.bat 脚本。 Tomcat 启动以后,默认使用 8080 端口,因此可以用浏览器访问 http://localhost:8080 来测试 Tomcat 是否正常启动。



Tomcat
提供了两个 Web 界面的管理工具, URL 分别是:

http://localhost:8080/admin/index.jsp

http://localhost:8080/manager/html

在启用这两个管理工具之前,先需要手工配置一下管理员用户和口令。用一个文本工具打开 CATALINA_HOME/conf/tomcat-users.xml 这个文件,加入如下几行:


<role rolename="manager"/>
<role rolename="admin"/>
<user username="robbin" password="12345678" roles="admin,manager,tomcat"/>




这样用户“ robbin ”就具备了超级管理员权限。重新启动 Tomcat 以后,你就可以使用该用户来登陆如上的两个管理工具,通过 Web 方式进行 Tomcat 的配置和管理了。

2
BEA Weblogic

Weblogic
可以到 BEA 的网站上免费注册之后下载到最新的 Weblogic8.1 企业版, License 可以免费使用 1 年时间,其实这已经完全足够了。 Weblogic 的下载连接: http://commerce.bea.com/index.jsp .../edocs.bea.com/

3
IBM Webshpere

Websphere
同样可以下载到免费的试用版本,到 IBM developerWorks 网站可以看到 Websphere 试用产品的下载和相关的 Websphere 的资料, developerWorks 中文网站的连接是: http://www-900.ibm.com/developerWorks/cn/wsdd/ Websphere 的下载连接: http://www7b.software.ibm.com/wsdd/...WASsupport.html

4
Jboss

Jboss
是免费开源的 App Server ,可以免费的从 Jboss 网站下载: http://www.jboss.org/index.html ,然 ...n.com/idea.html

四、 Java 应用的运行环境

Java
的应用可以简单分为以下几个方面:

1
Java 的桌面应用

桌面应用一般仅仅需要 JRE 的支持就足够了。



2
Java Web 应用

Java
Web 应用至少需要安装 JDK 和一个 web 容器(例如 Tomcat ),以及一个多用户数据库, Web 应用至少分为三层:

Browser
层:浏览器显示用户页面

Web
层:运行 Servlet/JSP

DB
层:后端数据库,向 Java 程序提供数据访问服务



3
Java 企业级应用

企业级应用比较复杂,可以扩展到 n 层,最简单情况会分为 4 层:

Browser
层:浏览器显示用户页面

Client
层: Java 客户端图形程序(或者嵌入式设备的程序)直接和 Web 层或者 EJB 层交互

Web
层:运行 Servlet/JSP

EJB
层:运行 EJB ,完成业务逻辑运算

DB
层:后端数据库,向 Java 程序提供数据访问服务



4
Java 嵌入式应用

Java
嵌入式应用是一个方兴未艾的领域,从事嵌入式开发,需要从 Sun 下载 J2ME 开发包, J2ME 包含了嵌入式设备专用虚拟机 KVM ,和普通的 JDK 中包含的 JVM 有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。


书籍篇

学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐 Oreilly 出版的 Java 系列书籍。

在这里我只想补充一点看法,很多人学习 Java 是从《 Thinking in Java 》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《 Thinking in Java 》并不是在完整的介绍 Java 的整个体系,而是一种跳跃式的写作方法,是一种类似 tips 的方法来对 Java 很多知识点进行了深入的分析和解释。

对于初学者来说,最好是找一本 Java 入门的书籍,但是比较完整的循序的介绍 Java 的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《 Thinking in Java 》,来加深对 Java 的理解和原理的运用,同时又可以完整的了解 Java 的整个体系。

对于 Java 的入门书籍,蔡学镛推荐的是 Oreilly 的《 Exploring Java, 2nd Edition 或者《 Java in a Nutshell,2nd Edition (针对 C++ 背景)》,我并没有看过这两本书。其实我觉得电子工业出版社的《 Java 2 编程详解》或者《 Java 2 从入门到精通》就很不错。

在所有的 Java 书籍当中,其实最最有用的,并不是 O'reilly Java Serials ,真正最最有用处是 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 ,什么其他的书籍都不需要了。

对于 Java Web 编程来说,最核心的是要熟悉和掌握 HTTP 协议,这个就和 Java 无关了,在熟悉 HTTP 协议之后,就需要熟悉 Java 的实现 HTTP 协议的类库,也就是 Servlet API ,所以最重要的东西就是 Servlet API 。当然对于初学者而言,直接通过 Servlet API 来学习 Web 编程有很大的难度,我推荐 O'reilly 的《 Java Server Pages 》这本书来学习 Web 编程。

EJB
的书籍当中,《 Enterprise JavaBeans, 2nd Edition 》是一本很不错的书, EJB 的学习门槛是比较高,入门很难,但是这本书完全降低了学习的难度,特别重要的一点是, EJB 的学习需要结合一种 App Server 的具体实现,所以在学习 EJB 的同时,必须同步的学习某种 App Server ,而这本书相关的出了三本书,分别是 Weblogic6.1 Websphere4.0 JBoss3.0 上面部署书中例子的实做。真是既有理论,又有实践。在学习 EJB 的同时,可以边看边做, EJB 的学习会变得很轻松。

但是这本书也有一个问题,就是版本比较旧,主要讲 EJB1.1 规范和部分 EJB2.0 的规范。而 Ed Roman 写的《 Mastering EJB 2.0 》这本书完全是根据 EJB2.0 规范写的,深入浅出,覆盖了 EJB 编程的各个方面,并且还有很多编程经验 tips ,也是学习 EJB 非常推荐的书籍之一。

如果是结合 Weblogic 来学习 J2EE 的话,《 J2EE 应用与 BEA Weblogic Server 》绝对是首选读物,虽然是讲述的 Weblogic6.0 ,仍然值得购买,这本书是 BEA 官方推荐的教材,作者也是 BEA 公司的工程师。现在中文版已经随处可见了。这本书结合 Weblogic 介绍了 J2EE 各个方面的技术在 Weblogic 平台上的开发和部署,实践指导意义非常强。

在掌握了 Java 平台基础知识和 J2EE 方面的知识以后,更进一步的是学习如何运用 OO 的方法进行软件的设计,那么就一定要学习“设计模式”。 Sun 公司出版了一本《 J2EE 核心模式》,是每个开发 Java 企业平台软件的架构师必备的书籍。这本书全面的介绍了 J2EE 体系架构的各种设计模式,是设计师的必读书籍。

过程篇

每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习 Java 是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。

学习 Java 的第一步是安装好 JDK ,写一个 Hello World ? 其实 JDK 的学习没有那么简单,关于 JDK 有两个问题是很容易一直困扰 Java 程序员的地方:一个是 CLASSPATH 的问题,其实从原理上来说,是要搞清楚 JRE ClassLoader 是如何加载 Class 的;另一个问题是 package import 问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习 Java 和使用 JDK 的最大障碍。推荐看一下王森的《 Java 深度历险》,对这两个问题进行了深入的探讨。第二步是学习 Java 的语法。 Java 的语法是类 C++ 的,基本上主流的编程语言不是类 C ,就是类 C++ 的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法, public protected private static ,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己琢磨出来的,花了很久的时间。不过后来我看到《 Thinking in Java 》这本书上面是讲了这些概念的。

第三步是学习 Java 的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖, Java 的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习 Java 之前没有 C++ 的经验,只有 C 的经验,我是大概花了一个月左右吧,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了不下 5 遍,才彻底领悟了。不过我想如果有 C++ 经验的话,应该一两天时间足够了。那么在这个过程中,可以多看看《 Thinking in Java 》这本书,对面向对象的讲解非常透彻。可惜的是我学习的时候,并没有看到这本书,所以自己花了大量的时间,通过自己的尝试和揣摩来学会的。

第四步就是开始熟悉 Java 的类库。 Java 的基础类库其实就是 JDK 安装目录下面 jre/lib/rt.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.*;






这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。

第六步, Java Web 编程

Web
编程的核心是 HTTP 协议, HTTP 协议和 Java 无关,如果不熟悉 HTTP 协议的话,虽然也可以学好 Servlet/JSP 编程,但是达不到举一反三,一通百通的境界。所以 HTTP 协议的学习是必备的。如果熟悉了 HTTP 协议的话,又有了 Java 编程的良好的基础,学习 Servlet/JSP 简直易如反掌,我学习 Servlet/JSP 就用了不到一周的时间,然后就开始用 JSP 来做项目了。



Servlet/JSP 的学习中,重头仍然是 Servlet Documentation Servlet API 最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。 Servlet/JSP 编程本质就是在反复调用这些类来通过 HTTP 协议在 Web Server Brower 之间交谈。另外对 JSP ,还需要熟悉几个常用 JSP 的标记,具体的写法记不住的话,临时查就是了。



此外 Java Web 编程学习的重点要放在 Web Application 的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照 MVC 设计模式的要求,运用 Servlet JSP 分别完成不同的逻辑层,掌握如何在 Servlet JSP 之间进行流程的控制和数据的共享,以及 Web Application 应该如何配置和部署。


第七步, J2EE 编程

以上的学习过程如果是比较顺利的话,进行到这一步,难度又陡然提高。因为上面的知识内容都是只涉及一个方面,而像 EJB JMS JTA 等核心的 J2EE 规范往往是几种 Java 技术的综合运用的结晶,所以掌握起来难度比较大。

首先一定要学习好 JNDI JNDI App Server 定位服务器资源( EJB 组件, Datasouce JMS )查找方法,如果对 JNDI 不熟悉的话, EJB JMS 这些东西几乎学不下去。 JNDI 其实就是 javax.naming.* 这个包,运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置,就需要看看专门的文档规范了,比如 web.xml 的写法, ejb-jar.xml 的写法等等。针对每种不同的 App Server ,还有自己的服务资源配置文件,也是需要熟悉的。

然后可以学习 JTA ,主要是要理解 JTA 对于事务的控制的方法,以及该在什么场合使用 JTA 。这里可以简单的举个例子,我们知道一般情况可以对于一个数据库连接进行事务控制 (conn.setAutoCommit(false),....,conn.commit()) ,做为一个原子操作,但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作,你能做的到吗?这时候只能用 JTA 了。假设操作过程是先往 A 数据库插一条记录,然后删除 B 数据库另一个记录,我们自己写代码是控制不了把整个操作做为一个原子操作的。用 JTA 的话,由 App Server 来完成控制。在学习 EJB 之前要学习对象序列化和 RMI RMI EJB 的基础。接着学习 JMS EJB ,对于 EJB 来说,最关键是要理解 EJB 是如何通过 RMI 来实现对远端对象的调用的,以及在什么情况下要用到 EJB

在学习完 EJB JMS 这些东西之后,你可能会意识到要急不可待学习两个领域的知识,一个是 UML ,另一个是 Design Pattern Java 企业软件的设计非常重视框架 (Framework) 的设计,一个好的软件框架是软件开发成功的必要条件。在这个时候,应该开始把学习的重点放在设计模式和框架的学习上,通过学习和实际的编程经验来掌握 EJB 的设计模式和 J2EE 的核心模式。

J2EE
规范里面,除了 EJB JMS JTA Servlet/JSP JDBC 之外还有很多很多的企业技术,这里不一一进行介绍了。

另外还有一个最新领域 Web Services Web Services 也完全没有任何新东西,它像是一种黏合剂,可以把不同的服务统一起来提供一个统一的调用接口,作为使用者来说,我只要获得服务提供者给我的 WSDL (对服务的描述),就够了,我完全不知道服务器提供者提供的服务究竟是 EJB 组件,还是 .Net 组件,还是什么 CORBA 组件,还是其他的什么实现,我也不需要知道。

Web Services
最伟大的地方就在于通过统一的服务提供方式和调用方式,实现了整个 Internet 服务的共享,是一个非常令人激动的技术领域。 Web Services 好像目前还没有什么很好的书籍,但是可以通过在网络上面查资料的方式来学习。

方法篇

Java
作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。

然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习 Documentation 编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握 Java

举个例子,我们都编过 Hello World


public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}




很多初学者不是很理解为什么 main 方法一定要这样来定义 public static void main(String[] args) ,能不能不这样写?包括我刚学习 Java 的时候也有这样的疑问。想知道答案吗?很简单,你把 main 改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把 main public 取掉,在试试看,报什么错误; static 去掉还能不能运行;不知道 main 方法是否一定要传一个 String[] 数组的,把 String[] 改掉,改成 int[] ,或者 String 试试看;不知道是否必须写 args 参数名称的,也可以把 args 改成别的名字,看看运行结果如何。



我当初学习 Java 的时候就是这样做的,把 Hello World 程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了 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 的类库的时候,当有些地方理解的不是很清楚的时候,或者想更加清晰的理解运作的细节的时候,往往会打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。