一、走进Java
Java是一个完整的平台,有一个庞大的库,其中包含了很多可重用的代码和一个提供诸如安全性、跨操作系统的可移植性以及自动垃圾收集等服务的执行环境。它是功能完善的通用程序设计语言,可以用来开发健壮的任务关键的应用程序。现在,它不仅用于Web程序设计,而且用于在服务器、台式计算机和移动设备上开发跨平台的独立应用程序。
二、Java"白皮书"的关键术语
1) 简单性
Java语法是C++语法的一个“纯净”版本。这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、虚基类等。其剔除了C++中许多很少使用、难以理解、易混淆的特性。目前看来,这些特性带来的麻烦远远多于其带来的好处。
2) 面向对象
简单地讲,面向对象设计是一种程序设计技术。传统结构化程序设计主要通过设计一系列的过程(即算法)来解决问题,即算法+数据结构=程序,先要确定如何操作数据,再决定如何组织数据使之便于操作。而面向对象程序设计将数据域(属性)和对数据的操作(方法)绑定在一个对象中,将数据放在第一位,然后再考虑操作数据的算法。
3) 分布式
Java有一个丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能通过URL打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。
4) 健壮性
Java的设计目标之一在于使得Java编写的程序具有多方面的可靠性。Java投入了大量的精力进行早期的问题检测(编译时检测),后期动态的检测(运行时检测),并消除了容易出错的情况。
5) 安全性
Java适用于网络/分布式环境。为了达到这个目标,在安全方面投入了很大精力。使用Java可以构建防病毒、防篡改的系统。
6) 体系结构中立
Java源文件经过编译生成中间字节码文件(.class),这是一种体系结构中立的文件格式,精心设计的字节码不仅可以很容易地在任何带Java虚拟机(JVM)的平台上运行,而且还可以动态地翻译成本地机器代码,即Java程序可以"一次编译,处处运行"。当然,解释虚拟机指令肯定会比全速运行机器指令慢很多。虚拟机有一个选项,可以将执行最频繁的字节码序列翻译成机器码,这一过程称为即时编译。
7) 可移植性
与C和C++不同,Java规范中没有"依赖具体实现"的地方。基本数据类型的大小以及有关运算都做了明确的说明。例如,Java中的int永远是32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器提供商指定的其他大小。唯一的限制只是int类型的大小不能低于short int,并且不能高于long int。在Java中,数据类型具有固定的大小,这消除了代码移植时令人头痛的主要问题。二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰。字符串是用标准的Unicode格式存储的。
8) 解释型
Java源程序(.java)在编写完成后,经过编译生成中间字节码文件(.class),字节码文件被JVM解释执行,不同于C/C++等编译型语言,字节码被解释为机器代码后立即执行,不产生中间机器代码文件。
9) 高性能
尽管对解释后的字节码性能已经比较满意,但有些场合下还需要更加高效的性能。字节码可以(在运行时刻)动态地翻译成对应运行这个应用的特定CPU的机器码。
10) 多线程
多线程可以带来更好的交互响应和实时行为。我们非常关注并发性,因为我们不再追求更快的处理器,而是着眼于获得更多的处理器,而且要让它们一直保持工作。Java是第一个支持并发程序设计的主流语言。
11) 动态性
Java能够适应不断发展的环境。库中可以自由地添加新方法和实例变量,而对客户端却没有任何影响。在Java中找出运行时的类型信息十分简单。
三、名词释疑
JDK
即Java开发工具包(Java Development Kit),是编写Java程序的程序员使用的软件,包括开发和运行Java程序的软件。
OpenJDK
Java SE的一个免费开源实现,不包含浏览器集成或JavaFX
SDK
即Software Development Kit,是一个过时的术语,用于描述1998 ~ 2006年之间的JDK
J2
一个过时的术语,用于描述1998 ~ 2006年之间的Java版本
JRE
即Java运行时环境(Java Runtime Environment),是运行Java程序的用户使用的软件,它包含Java虚拟机但不包含编译器,为不需要开发只需要运行Java程序的用户提供。
Sever JRE
在服务器上运行Java程序的软件。
JVM
即Java虚拟机(Java Virtual Machine),用于解释执行中间字节码文件。
API
即应用程序接口(Application Program Interface),也称为库,包括为开发Java程序而预定义的类和接口。
IDE
即集成开发环境(Integrated Development Environment),是为了快速开发程序而提供的开发工具,编辑、编译、链接、调试和在线帮助都集成在一个图形用户界面中。
applet
能在Web浏览器中运行的Java程序称为Java小程序(applet)
Java SE
即Java标准版(Java Standard Edition),可以用来开发客户端的应用程序。应用程序可以独立运行或作为applet在Web浏览器中运行。
Java EE
即Java企业版(Java Enterprise Edition),可以用来开发服务器端的应用程序,例如,Java servlet和JavaServer Pages(JSP),以及JavaServer Faces(JSF)。
Java ME
即Java微型版(Java Micro Edition),可以用来开发移动设备的应用程序,例如手机。
JavaFX
开发Java GUI程序的框架,在Oracle的Java SE发布版本中提供。
四、JDK、JRE和JVM三者的关系
见大牛博客:JDK、JRE、JVM三者间的关系
五、创建、编译和执行Java程序的过程
Java源程序编写后被保存为.java文件,通过Java编译器编译生成字节码.class文件,字节码文件和所需的库代码被送去JVM解释执行。在执行一个Java程序时,JVM首先会用一个称为类加载器(class loader)的程序将类的字节码加载到内存中。如果你的程序中使用其他类,类加载程序会在需要它们之前动态地加载它们。当加载该类后,JVM使用一个字节码验证器(bytecode verifier)的程序来检验字节码的合法性,确保字节码不会违反Java的安全规范,以确保来自网络的Java程序不会篡改和危害你的计算机。
六、通过命令行编译、运行Java程序
在命令行里输入以下命令编译Java程序:
javac classname.java
编译成功后,使用以下语句运行程序:
java classname //注意此处不要加.class后缀
注意:如果提示命令不存在,应该先配置环境变量,在path中用分号和前面的内容分隔,然后加入jdk/bin的路径,因为java.exe,javac.exe文件都在该目录下。
七、注释
1) 行注释
行注释以//
开始,不能跨行
2) 块注释
块注释以/*
开始,以*/
结尾,可以跨行
3) 文档注释
文档注释以/**
开始,以*/
结尾,添加方法是输入/**
后回车即可,可以添加@author
、@version
等参数,它能使用JDK的javadoc命令提取一个HTML文件(在控制台输入javadoc 文件名
,然后会在执行目录下生成若干文件,打开index.html即可)。使用javadoc注释来注释整个类或整个方法,为了将这些注释提取出来放在一个javadoc HTML文件中,这些注释必须放在类或者方法头前面。要注释方法中的某一步骤,使用行注释//
更多文档注释内容详见:Java学习总结之对象与类
八、程序设计错误
1) 语法错误
在编译过程中出现的错误称为语法错误或编译错误。
2) 运行时错误
运行时错误是引起程序非正常中断的错误,即程序能通过编译,但在运行时环境检测到一个不可能执行的操作,就会出现运行错误。
3) 逻辑错误
当程序没有按预期的方式执行就会发生逻辑错误。
九、Java标识符
Java标识符用于命名类、接口、变量、常量、方法等,有如下规则:
- 标识符是由字母、数字、下划线(
_
)和美元符号($
)组成的字符序列 - 必须以字母、下划线(
_
)或美元符号($
)开头,不能以数字开头 - 标识符不能是关键字(如public)或保留字(如goto)
- 标识符不能是true、false或null等字面常量
- 标识符可以为任意长度
- 不要用字符
$
命名标识符,习惯上$
只用于机器自动产生的源代码中
十、命名规范
注意:在命名时尽量避免采用缩写作为标识符,用完整的词汇会更具有描述性,比如numberOfStudents比numStds、numOfStuds或者numOfStudents要好。另外,Java是区分大小写的。
1) 类名和接口
使用Pascal命名法,每个单词的首字母大写,例如类名ComputeArea和System
2) 变量和方法
使用驼峰命名法,一个单词都小写,如有多个单词则第一个单词字母小写,后面每个单词的首字母大写,例如变量radius以及方法setRadius
3) 常量
大写常量的所有字母,如果有多个单词,单词之间用下划线连接,例如,常量PI和常量MAX_VALUE
十一、Java 与 C++ 的区别
- Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object,C++ 为了兼容 C 既支持面向对象又支持面向过程。
- Java 通过虚拟机从而实现跨平台特性,但是 C++ 依赖于特定的平台。
- Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。
- Java 支持自动垃圾回收,而 C++ 需要手动回收。
- Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。
- Java 不支持操作符重载,虽然可以对两个 String 对象执行加法运算,但是这是语言内置支持的操作,不属于操作符重载,而 C++ 可以。
- Java 的 goto 是保留字,但是不可用,C++ 可以使用 goto。
- Java 不支持条件编译,C++ 通过 #ifdef #ifndef 等预处理命令从而实现条件编译。