在写这篇博客之前,我想对自己进行简单概括:我从事软件开发工作已经三年多了,并且一直在从事.NET相关项目的开发。为什么突然间想学习Java呢?有以下几个原因:
1. 开发程序三年多来,已经对.NET相关体系完成了基本掌握,但是还不是炉火纯青的那种,我不想一直忙碌的奔跑,想停下来看看Java这位与.NET势均力敌的"大腕"的精妙之处,比较两者之间各自的优势与应用领域,以便为以后软件架构师(主要在扩展知识体系而非语言)做一定准备;
2. Java更加需要注重个人思维解决问题,而.NET却提供了丰富的体系结构更注重业务的搭建,对于目前我这个中高级软件工程师而言,最好的催化剂莫过于对软件思维的提升,而不是去"拿来"别人搭建的丰富类库及结构;
3. 还有比较现实的,为了工作,为了钱钱,为了丰富自己的职业视野等等....
好了,废话不多说,开始我们的Java学习之旅吧。我们都知道:Java分为三大应用领域:J2SE、J2EE、J2ME。J2SE是整个Java技术的核心和基础,同时也是J2EE和J2ME编程框架的基础。J2EE是企业级开发应用的完整解决方案。J2ME主要应用于移动通信设备和信息家电领域。Java是一种先编译后解释的高级语言,Java语言程序经过编译生成与平台无关的字节码(*.class文件,不可执行的),字节码文件经过Java虚拟机(JVM)转化为特定系统的机器码解释执行。也就是说,系统运行平台不针对任何Java程序,只针对JVM,而编译器生成的字节码也只针对JVM,提供相同的编程接口,实现了跨平台应用。
在开发Java程序之前,必须安装和配置JDK。这里涉及一个概念:JRE(Java运行时环境),前面提到JVM是虚拟机,负责将字节码文件转化为针对特定系统的机器码解释执行。但除了JVM之外,还需要安装JRE(包含JVM)提供Java运行环境支持,而JDK又包含JRE,如果你的应用程序是用于开发的话,则安装JDK;相反仅仅作为运行时,则仅安装JRE。简单总结一下,Java程序需要经历以下两个步骤:1.将源文件编译成与平台无关的字节码;2.将字节码解释成特定平台的机器码。分别对应于javac和java命令,要想使用这两个命令则需要设置Path环境变量,即将Java安装路径(如D:\Java\jdk1.7.0_05\bin)添加到"用户变量(JAVA_HOME)"中,可以通过"我的电脑"属性页设置,也可以运行一下批处理命令autoexec.bat(保存在系统盘根目录,重启将自动执行)。
set Path=%Path%;D:\Java\jdk1.7.0_05\bin
如果使用Linux配置环境变量进行开发时,首先必须进入当前用户(假设叫mirhe)的home路径下并使用命令(ls -a)查看当前路径的所有文件(包含隐藏文件),你会发现有一个文件.bash_profile,我们正是在这个文件中配置环境变量。使用无格式的记事本打开该文件并在PATH变量后追加(请注意Linux路径是用:来进行分割的,而Windows采用;分割):
# 设置PATH环境变量 PATH=.:$PATH:$HOME/bin:/home/mirhe/java/jdk_1.7.0_05/bin
完成设置后关闭该文件,你也可以再文件最后追加以下命令来查看当前的环境变量:
# 导出PATH环境变量
export PATH
重新登录Linux平台或执行以下命令(source .bash_profile)使PATH环境变量生效。
可能很多朋友学习Java时还会设置另外一个环境变量CLASSPATH的值,那这个环境变量真的需要设置吗?它的作用是什么呢?我们都知道当执行"java 类名"时,JRE从哪里去搜索Java类呢?可能朋友会说:在当前路径下(.)搜索。但是JDK1.4之前版本并未设计这个自动在当前路径查找字节码的功能,也即当前路径下包含"类名.class"的字节码时,仍然会出现"找不到类"的错误。除此之外,还需要将JDK的lib路径下的dt.jar和tools.jar包含到CLASSPATH中。
classpath的值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(注意别忘记.;)
但JDK1.5之后版本加入了自动查找字节码文件的功能,因此不需要设置CLASSPATH变量。有时我们需要临时改变CLASSPATH变量的值,以便在我们定义的路径下去查找字节码文件。
java -classpath dir1;dir2;...;dirN
不过此时会覆盖此前系统设置的CLASSPATH变量的值,要想不覆盖则可以将之前的值追加到路径列表中。
java -classpath %CLASSPATH%;.;dir1;dir2;...;dirN
接下来我们以入门示例(HelloWorld)来说明Java编译和运行的整个过程。在记事本中(建议使用Notepad++)添加以下代码:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
分别在源文件所在路径下执行javac HelloWorld.java和java HelloWorld将输出"Hello World!"。有时为了方便,我们不使用命令行运行程序,而是利用文本编译器中设置一些快捷方式(在Notepad++中直接编译运行java代码以及在Sublime Text 2中编译和运行Java程序),以更快的运行程序,强烈建议初学者使用轻量级记事本或文本编译器来练习,搞懂Java程序的运行原理,待比较熟练掌握基础知识后并需要项目开发实践时再选用适合自身的IDE。
编译Java: cmd /k javac "$(FULL_CURRENT_PATH)"&PAUSE, 快捷方式: Ctrl + C 运行Java: cmd /k cd /d "$(CURRENT_DIRECTORY)"&java "$(NAME_PART)"&PAUSE, 快捷方式: Ctrl + R 编译并运行Java: cmd /k javac "$(FULL_CURRENT_PATH)"&cd /d "$(CURRENT_DIRECTORY)"&java "$(NAME_PART)"&PAUSE,快捷方式: Ctrl + E
其中包含一些宏定义:$(FULL_CURRENT_PATH)"——当前带路径的文件名(如:C:\Project\HelloWorld.java);$(CURRENT_DIRECTORY)"——当前的路径(如:C:\Project\);$(NAME_PART)——不带扩展名的文件名(如:HelloWorld);此外还有:$(FILE_NAME)——完整的文件名(如:HelloWorld.java);$(EXT_PART)——文件的扩展名(如:java)等。
我们都知道,Java源文件名称是可以为任意的(除开源代码中包含public类,则源文件的主文件名与public类相同),因此一个源文件可包含多个类,但最多只能定义一个public类,且主文件名必须与这个public类名一致。因此通常建议:一个Java源文件只定义一个类,并将该类定义成public,保持源文件名与public类名一致。