经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下。在讲解数据类型之前,我顺便提及一下Java注释:单行注释、多行注释以及文档注释,这里重点强调文档注释。通常单行注释独占一行并用"//"来开头,多行注释会占据多行并用/*...*/来表示。
/*
HelloWorld是每一个Java学习者的起点,
需要好好掌握
*/
public class HelloWorld {
public static void main(String[] args) {
// 输出Hello World!
System.out.println("Hello World!");
}
}
  那什么叫文档注释呢?简单的说,是利用javadoc将源代码的文档注释生成一份API文档,供使用者查询和参考。JDK API的在线文档查询:http://dlc.sun.com.edgesuite.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/latest/html/zh_CN/api/,从文档界面不难看出分成三大区:包列表区(左上方)、类列表区(左下方)、详细说明区(右侧)。点击左侧"类列表区"中的类,右侧将显示该类对应的构造函数、属性、方法等详细信息。接下来,我们利用javadoc来生成一份API文档,需要说明的是,javadoc只处理以public或protected修饰的类、接口、方法、属性、构造器和内部类之前的文档注释而忽略其他地方的文档注释,如果开发者希望给使用者提供private成员的文档,则需要加入-private选项。文档注释用/**...*/来表示。javadoc的语法如下:
  javadoc -d [API文档存放目录] -windowtitle [API文档浏览器标题] -doctitle [概述页面标题] -header [页面页眉] ... Java源文件/包 (可利用javadoc -help查询全部选项)
  如源代码中包含中文,则需要设置-locale, -encoding, -charset如下:
  javadoc -d [API文档存放目录] -windowtitle [API文档浏览器标题] -doctitle [概述页面标题] -header [页面页眉] -encoding utf-8 -charset utf-8 -locale zh_CN ... Java源文件/包 (可利用javadoc -help查询全部选项)
  同时,为了更详细说明类、方法等成员的文档信息,经常添加以下javadoc标记(如@author、@version、@param、@return等)到这些成员上加以说明。
package miracle;
/**
* Description:
* <br/>此程序主要测试Javadoc指令来生成文档注释
* <br/>程序名:TestJavadoc.java
* <br/>编写日期:2012-08-22
* @author Miracle, He miracle@sina.com
* @version 1.0
*/
public class TestJavadoc {
/**
* 测试属性
*/
protected String name;
/**
* 主方法,程序入口
* @param args 输入参数列表
*/
public static void main(String[] args) {
System.out.println("Hello, Miracle!");
}
}
package miracleHe;
/**
* Description:
* <br/>此程序主要测试Javadoc指令来生成文档注释
* <br/>程序名:TestJavadocTag.java
* <br/>编写日期:2012-08-22
* @author Miracle, He miracle@sina.com
* @version 1.0
*/
public class TestJavadocTag {
/**
* 此方法用来打招呼
* @param name 打招呼的名称
* @return 返回打招呼的字符串
*/
private String hello(String name) {
return name + ",你好!";
}
}
  我们这里添加了两个包miracle和miracleHe(目的为生成概述),执行以下命令将输出API文档。
  javadoc -d apidoc -windowtitle "Generate Javadoc" -doctitle "Learning HelloWorld Class by Javadoc" -header "Javadoc Test" -charset "utf-8" -encoding "utf-8" Test*.java
  默认情况下不会提取@author、@version等信息,如需提取则需要添加。
  javadoc -d apidoc -windowtitle "Generate Javadoc" -doctitle "Learning HelloWorld Class by Javadoc" -header "Javadoc Test"-charset "utf-8" -encoding "utf-8" -author -version Test*.java
  Java是强类型语言,也是变量或表达式在编译时已经明确其类型,即先声明后使用。数据类型分为: 基本类型(Primitive Type)和引用类型(Reference Type)。其组织关系如下:基本类型包含整数类型(byte、short、int、long)、字符类型(char)、浮点类型(float、double)和布尔类型(true、false);引用类型包含字符串(String)、数组、类、接口和空类型(null)。先从整数类型谈起,如果一个较小的整数(在byte或short的范围之内)赋值给byte或short时,系统会自动转化为对应的类型;如果一个巨大的整数(超出int的范围),系统则不会自动当做long来进行处理,需要添加后缀L来进行标识,即使这个整数在int的范围之内声明的long类型变量不添加L仍然当做是int。
  public class TestInteger {
  public static void main(String[] args) {
  byte b = 56; //系统会自动转化为byte
  //long big = 999999999999; //出错,系统不会当作long来处理
  long big2 = 41433333313243133L; //使用L强制为long类型
  }
  }
  整数除了十进制来表示外,还可以使用八进制(0开头)以及十六进制(0x开头,A~F代表10~15)来进行表示。
  int octalValue = 013;
  int hexValue = 0x2F;
  虽然字符型被单独处理,但其实它是一种整数(0~65535之间的无符号整数),字符通常可以使用''(如'A')、转义字符(' '、' ')和Unicode('uXXXX',前256个字符与ASCII码一致)来表示。如果将0~65535之间的整数赋给char变量将直接将int转化为char类型。
  public class TestChar {
  public static void main(String[] args) {
  //定义字符型
  char a = 'a';
  char enter = ' ';
  char ch = 'u24af';
  System.out.println(ch);//输出?
  char yu = '宇';
  int yuValue = yu;
  System.out.println(yuValue);//23431
  char c = 97;
  System.out.println(c);//a
  }
  }
  但请注意,字符串虽然是由字符组成(可看作字符数组),但字符串是引用类型。接下来,我们讨论一下浮点数。浮点数分为单精度浮点数(float)和双精度浮点数(double)。其中float占4个字节,第一位是符号位,接下来8位是指数位,后23位是尾数,必须要添加后缀F;double占8个字节,第一位是符号位,接下来11位是指数位,后52位是尾数,是默认类型,可以不添加后缀D来标识。浮点数可用十进制(如5.12,.512)和科学计数法(5.12E2)来表示。特别需要注意的是:浮点数还包含三个特殊的值,正无穷大(POSITIVE_INFINITY,通过正数除以0得到)、负无穷大(NEGATIVE_INFINITY,通过负数除以0得到)和非数(NaN,通过0.0除以0.0或对负数开方得到)。所有正无穷大值都相等,所有负无穷大值相等,非数不与任何数相等(包含NaN本身也不相等)。
  public class TestFloat {
  public static void main(String[] args) {
  float f = 5.12F;
  double zero = 0.0;
  float p = Float.POSITIVE_INFINITY;
  double n = Double.NEGATIVE_INFINITY;
  System.out.println(p==n);//false
  System.out.println(f/zero);//Infinity
  System.out.println(f/zero==p);//true
  System.out.println(0.0/zero==Double.NaN);//false
  System.out.println(6.0/0==8.2/0);//true
  System.out.println(1/0);//抛出异常
  }
  }
  另外提一句,bool类型只能为true或false,不能用0或非0来表示,其他基本类型都不能转化为bool类型,如果bool类型与字符串相连,将直接转化为字符串。
  接下来,我们讨论一下数据类型转换相关知识。数据类型转换分为自动转换和强制转换,自动转换的关系如下图: