一个简单的 JAVA 应用程序
public class FirstSample
{
public static void main(String[] args)
{
System.out.println("We will not use 'Hello, World!'");
}
}
- 关键字public 称为访问修饰符( access modifier ), 这些修饰符用于控制程序的其他部分对这段代码的访问级別
- 关键字class 表明Java 程序中的全部内容都包含在类中。这里, 只需要将类作为一个加载程序逻辑的容器, 程序逻辑定义了应用程序的行为
- 关键字class 后面紧跟类名。Java 中定义类名的规则很宽松。名字必须以字母开头,后面可以跟字母和数字的任意组合。长度基本上没有限制。但是不能使用Java 保留字(例如,public 或class ) 作为类名
- 标准的命名规范为(类名FirstSample 就遵循了这个规范):类名是以大写字母开头的名词。如果名字由多个单词组成, 每个单词的第一个字母都应该大写(这种在一个单词中间使用大写字母的方式称为骆驼命名法。以其自身为例, 应该写成CamelCase)。
- 源代码的文件名必须与公共类的名字相同,并用.java 作为扩展名。因此,存储这段源代码的文件名必须为FirstSample.java ( 再次提醒大家注意,大小写是非常重要的, 千万不能写成firstsample.java)
- 如果已经正确地命名了这个文件, 并且源代码中没有任何录人错误, 在编译这段源代码之后就会得到一个包含这个类字节码的文件。Java 编译器将字节码文件自动地命名为 FirstSample.class, 并与源文件存储在同一个目录下。最后, 使用下面这行命令运行这个程序:
java FirstSample
- (请记住,不要添加.class 扩展名。)程序执行之后, 控制台上将会显示“We will not use ‘Hello, World!’”。
- 当使用
java ClassName
运行已编译的程序时,Java 虚拟机将从指定类中的main 方法开始执行(这里的“ 方法”就是Java 中所说的“ 函数”), 因此为了代码能够执行, 在类的源文件中必须包含一个main方法。当然,也可以将用户自定义的方法添加到类中,并且在main 方法中调用它们
数据类型
在Java 中, 共有8种基本类型( primitive type ), 其中有4 种整型、2 种浮点类型、1 种用于表示Unicode 编码的字符单元的字符类型char 和1 种用于表示真值的boolean 类型。
整型
整型用于表示没有小数部分的数值, 它允许是负数。Java 提供了4 种整型
整型的范围与运行Java 代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题
浮点型
浮点类型用于表示有小数部分的数值。在Java 中有两种浮点类型
- double 表示这种类型的数值精度是float 类型的两倍(有人称之为双精度数值)。绝大部分应用程序都采用double 类型。在很多情况下,float 类型的精度很难满足需求。实际上,只有很少的情况适合使用float 类型,例如,需要单精度数据的库, 或者需要存储大量数据。
- float 类型的数值有一个后缀F 或f ( 例如, 3.14F)。没有后缀F 的浮点数值(如3.14 ) 默认为double 类型。当然,也可以在浮点数值后面添加后缀D 或d ( 例如,3.14D)。
char 类型
char 类型原本用于表示单个字符。不过, 现在情况已经有所变化。如今, 有些Unicode字符可以用一个char 值描述, 另外一些Unicode 字符则需要两个char 值。
char 类型的字面量值要用单引号括起来。例如:‘A’ 是编码值为65 所对应的字符常量。它与 “A” 不同,“A” 是包含一个字符A 的字符串, char 类型的值可以表示为十六进制值,其范围从 \u0000 到\Uffff。例如:\u2122 表示注册符号, \u03C0 表示圆周率。
强烈建议不要在程序中使用char 类型, 除非确实需要处理UTF-16 代码单元。最好将字符串作为抽象数据类型处理
boolean 类型
boolean ( 布尔)类型有两个值: false 和true, 用来判定逻辑条件整型值和布尔值之间不能进行相互转换。
常量
在Java 中, 利用关键字final 指示常量。
public class Constants
{
public static void main(String[] args)
{
final double CM_PER_INCH = 2.54;
double paperWidth = 8.5;
double paperHeight = 11;
System,out.println("Paper size in centimeters: "
+ paperWidth * CM PER INCH + " by " + paperHeight * CM.PER.INCH);
}
}
关键字final 表示这个变量只能被赋值一次。一旦被赋值之后, 就不能够再更改了。习惯上,常量名使用全大写。
在Java 中,经常希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量。可以使用关键字static final 设置一个类常量。下面是使用类常量的示例:
public cl ass Constants〗
{
public static final double CM_PER_INCH = 2.54;
public static void main(Stringn args)
{
double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters: "
+ paperWidth * CMJERJNCH + by " + paperHeight * CM_PER_INCH) ;
}
}
const 是Java 保留的关键字, 但目前并没有使用。在Java 中, 必须使用final定义常量。
字符串
Java 没有内置的字符串类型, 而是在标准Java 类库中提供了一个预定义类, 很自然地叫做String。每个用双引号括起来的字符串都是String 类的一个实例:
String e = ""; // an empty string
String greeting = "Hello";
String 类没有提供用于修改字符串的方法。由于不能修改Java 字符串中的字符, 所以在Java 文档中将String 类对象称为不可变字符串
输入输出
要想通过控制台进行输人,首先需要构造一个Scanner 对象,并与“ 标准输人流” System.in 关联。
Scanner in = new Scanner(System.in);
现在, 就可以使用Scanner 类的各种方法实现输入操作了。例如, nextLine 方法将输入一行。
System.out.print("What is your name? ");
String name = in.nextLine();
在这里, 使用nextLine 方法是因为在输人行中有可能包含空格。要想读取一个单词(以空白符作为分隔符),就调用
String firstName = in.next();
要想读取一个整数, 就调用nextlnt 方法。
System.out.print("How old are you? ");
int age = in.nextInt();
与此类似,要想读取下一个浮点数, 就调用nextDouble 方法。
Scanner 类定义在java.util 包中。当使用的类不是定义在基本java.lang 包中时, 一定要使用import 指示字将相应的包加载进来。
import java.util.*;
/**
* This program demonstrates console input.
* @version 1.10 2004-02-10
* @author Cay Horstmann
*/
public class InputTest
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
// get first input
System.out.print("What is your name? ");
String name = in.nextLine();
// get second input
System.out.print("How old are you? ");
int age = in.nextInt();
// display output on console
System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));
}
}
因为输入是可见的, 所以Scanner 类不适用于从控制台读取密码。Java SE 6 特别引入了Console 类实现这个目的。要想读取一个密码, 可以采用下列代码:
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd =cons.readPassword("Password:");
为了安全起见, 返回的密码存放在一维字符数组中, 而不是字符串中。在对密码进行处理之后, 应该马上用一个填充值覆盖数组元素
采用Console 对象处理输入不如采用Scanner 方便。每次只能读取一行输入, 而没有能够读取一个单词或一个数值的方法。
控制流程
Java 的设计者将 goto 作为保留字, 但实际上并没有打算在语言中使用它。通常,使用 goto 语句被认为是一种拙劣的程序设计风格。当然,也有一些程序员认为反对 goto 的呼声似乎有些过分(例如, Donald Knuth 就曾编著过一篇名为《Structured Programming with goto statements》的著名文章)。 这篇文章说:无限制地使用goto 语句确实是导致错误的根源,但在有些情况下, 偶尔使用goto 跳出循环还是有益处的。Java 设计者同意这种看法, 甚至在Java 语言中增加了一条带标签的 break, 以此来支持这种程序设计风格。
看一下不带标签的break 语句。与用于退出switch 语句的break 语句一样, 它也可以用于退出循环语句。例如,
while (years <= 100)
{
balance += payment ;
double interest = balance * interestRate / 100;
balance += interest;
if (balance >= goal ) break;
years++ ;
}
Java 还提供了一种带标签的 break 语句, 用于跳出多重嵌套的循环语句。有时候,在嵌套很深的循环语句中会发生一些不可预料的事情。此时可能更加希望跳到嵌套的所有循环语句之外。通过添加一些额外的条件判断实现各层循环的检测很不方便。这里有一个示例说明了break 语句的工作状态。请注意,标签必须放在希望跳出的最外层循环之前, 并且必须紧跟一个冒号。
Scanner in = new Scanner(System.in);
int n;
read_data:
while (. . .) // this loop statement is tagged with the label
{
for (. . .) // this inner loop is not labeled
{
Systen.out.print("Enter a number >= 0: ");
n = in.nextlntO;
if (n < 0) // should never happen-can’t go on
break read.data;
// break out of readjata loop
}
}
// this statement is executed immediately after the labeled break
if (n < 0) // check for bad situation
{
// deal with bad situation
}
else
{
// carry out normal processing
}
大数值
如果基本的整数和浮点数精度不能够满足需求, 那么可以使用 java.math 包中的两个很有用的类: Biglnteger 和 BigDecimaL 这两个类可以处理包含任意长度数字序列的数值。Biglnteger 类实现了任意精度的整数运算, BigDecimal 实现了任意精度的浮点数运算。
使用静态的valueOf 方法可以将普通的数值转换为大数值:
Biglnteger a = Biglnteger.valueOf(100) ;
遗憾的是,不能使用人们熟悉的算术运算符(如:+ 和*) 处理大数值。而需要使用大数值类中的add 和multiply 方法。
Biglnteger c = a.add(b) ; // c = a + b
Biglnteger d = c.nul ti pi y(b.add(Biglnteger.val ueOf(2))); // d = c * (b + 2)