java from scratch
1. 概述
hello word程序(Welcome.java):
public class Welcome {
public static void main(String[] args) {
System.out.println("welcome to java.");
}
}
Java源程序是区分大小写的。
Java源程序保存为.java文件,编译为.class文件。.class文件由Java虚拟机 (JVM)执行。源文件的扩展名必须是 .java, 而且文件名必须与公共类名完全相同。
在执行程序之前,必须创建程序并进行编译。Java 编译器将 Java 源文件翻译成 Java 字节码文件。下面的命令就是用来编译 Welcome, java的:
javac Weicome.java
执行 Java 程序就是运行程序的字节码,可以在任何一个装有 JVM 的平台上运行字节码,解释 Java 字节码。下述命令用来运行程序清单中的字节码:
java Welcome
2. 基本程序设计
为了让编译器知道变量是什么,需要指明它们的数据类型,即存储在变量中的数据的类型,是整数、实数,或者其他。这称为声明变量。Java 提供简单数据类型来表示整数 、实数、字符以及布尔类型。这些类型称为原始数据类型或基本类型。
从控制台读取输入
Java使用System.out来表示标准输出设备,而用System.in来表示标准输入设备。为了完成控制台输出,只需使用 println 方法就可以在控制台上显示基本值或字符串。Java并不直接支持控制台输入,但是可以使用 Scanner 类创建它的对象,以读取来自 System.in 的输入,如下所示:
Scanner input = new Scanne(System.ln);
这行代码表明创建了一个Scanner对象,并且将它的引用值陚值给变量input。对象可以调用它自己的方法。
import java.util.Scanner;
public class ComputeArea {
public static void main(String[] args){
final double PI = 3.14;
Scanner input_ = new Scanner(System.in);
System.out.print("Enter a number for radius: ");
double radius = input_.nextDouble();
double area = radius * radius * PI;
System.out.println("The Area for the circle of radius " + radius
+ " is " + area);
}
}
包导入
import 语句有两种类型:明确导入( specific import) 和通配符导入(wildcard import)。明确导入是在 import 语句中指定单个的类。例如,上面的代码首行语句就是从包 java.util 中导入Scanner。
通配符导入是指通过使用星号作为通配符,导入一个包中所有的类。例如,下面的语句导入包 java.util 中所有的类。
Import java.util.*
导入语句只是告诉编译器在什么地方能找到这些类。声明明确导入和声明通配符导入在性能上是没有什么差别的。
变量
变量用于表示特定类型的数据。为了使用变量,可以通过告诉编译器变量的名字及其可以存储的数据类型来声明该变量。变量声明告知编译器根据数据类型为变量分配合适的内存 空间。
声明变量之后,可以使用赋值语句(assignment statement)给它赋一个值。在Java中,将等号(=)作为赋值操作符(assignment operator)。
表达式(expression)表示涉及值 、变量和操作符的一个运算,它们组合在一起计算出一 个新值。变量也可用在表达式中。在 Java 中,赋值语句本质上就是计算出一个值并将它賦给操作符左边变量的一个表达式。由于这个原因,賦值语句常常称作賦值表达式(assignment expression)。例如,下面的语句是正确的:
System.out.println(x=1);
在賦值给变量之前,必须声明变量。方法中声明的变量在使用之前必须被赋值。 任何时候,都要尽可能一步完成变量的声明和赋初值。这会使得程序易读,同时避免程序设计错误。
常量
—个变量的值在程序执行过程中可能会发生变化,但是命名常量(named constant) 或简称常量,则表示从不改变的永久数据。
final datatype C0NSTANTNAHE =value;
常量必须在同一条语句中声明和赋值。单词 final 是声明常量的 Java 关键字。
变量 、常量 、方法和类的命名习惯:
- 使用小写字母命名变量和方法。如果一个名字包含多个单词,就将它们连在一起, 第一个单词的字母小写,而后面的每个单词的首字母大写,例如,变量 radius 和 area 以及方法 print。
- 类名中的每个单词的首字母大写,例如,类名ComputeArea和System。
- 大写常量中的所有字母,两个单词间用下划线连接,例如,常量PI和常量MAX_VALUE。
数值类型和操作
Java 为数值 、字符值和布尔值数据提供了八种基本数据类型。
类型名 | 范围 | 存储大小 |
---|---|---|
byte | -2^7 ~ 2^7 -1 | 8位带符号数 |
short | -2^15 ~ 2^15 -1 | 16位带符号数 |
int | -2^31 ~ 2^31 - 1 | 32位带符号数 |
long | -2^63 ~ 2^63 -1 | 64位带符号数 |
float | -3.4028235E+38 ~ -1.4E-45; 1.4E-45 ~ 3.4028235E+38 | 32位标准 IEEE 754 |
double | -1.7976931348623157E+308 ~ -4.9E-324; 4.9E-324 ~ 1.7976931348623157E+308 | 64位标准 IEEE 754 |
数值操作符
数值数据类型的操作符包括标准的算术操作符:加号(+)、减号(-)、乘号(* )、除号(/)
和求余号(%),幂运算(Math.pow(a,b))
数值直接量
整型直接量默认为是int型的,为了表示一个long型的整型直接量,需要在其后追加字母L或l,默认情况下 ,整型直接量是一个十进制整数。要表示一个二进制整数直接量,使用 0b或者0B 开头;表示一个八进制整數直接量,就用 0开头,而要表示一个十六进制整数直接量,就用0x或0X开头。浮点型直接量带小数点,默认情况下是 double 型的。可以通过在数字后面加字母 f 或 F 表示该数为 float 型直接量,也可以在数字后面加d或D表示该数为double型直接量。
科学记数法
浮点型直接量也可以用科学计数法表示,比如,1.23456 X 10^2可以写成1.23456E2或者l.23456E+2,而 1.23456 x 10^-2 等于1.23456E-2。E(或e)表示指数,既可以是大写的也可以是小写的。
显示时间
可以通过调用 System.currentTimeMillis()返回当前时间。System类中的方法 currentTimeMillis返回从GMT1970年1月1日00:00:00开始到当前时刻的毫秒数。
增强赋值和自增自减操作
操作符 +、-、*、/、%可以结合賦值操作符形成增强操作符+=,-=, *=,/=,%=。
自增操作符(++) 和自减操作符(--) 是对变量进行加 1 和减 1 的操作。
i++和i--,这些操作符分别称为后置自增操作符和后置自减操作符,因为操作++符和 -- 放在变量后面,在实际运算中,表示变量 i 的值加(减) 1 且使用 i 增加(减少)前的值。++i 和 --i,这些操作符称为前置自增操作符和前置自减操作符。在实际运算中,表示变量 i 的值加(减) 1 且使用 i 增加(减少)后的新值。
类型转换
总是可以将一个数值赋给支持更大数值范围类型的变量,例如,可以将 long 型的值赋给 float 型变量。但是,如果不进行类型转换,就不能将一个值賦给范围较小类型的变量。
类型转換是一种将一种数据类型的值转换成另一种数据类型的操作。将一个小范围类型的变量转换为大范围类型的变量称为拓宽类型(widening a type),把大范围类型的变量转换为小范围类型的变量称为缩窄类型( narrowing a type)。Java 将自动拓宽一个类型,但是,缩窄类型必须显式完成。
类型转换的语法要求目标类型放在括号内,紧跟其后的是要转换的变量名或值。
System.out.println((double)l / 2); // 显示0.5
类型转换不改变被转换的变量。
注意:Java 中,x1 op= x2 形式的增强賦值表达式,执行为 x1 = (T)(x1 op x2), 这里 T是 x1 的类型。因此,下面代码是正确的。
int sum = 0;
sum += 4.5; // 等价于sum = (int)(sum + 4.5)
boolean数据类型
Java 提供六种关系操作符(relational operator)(也称为比较操作符(comparison operator)),用于两个值的比较:<,<=,>,>=,==,!=。
具有布尔值的变量称为布尔变量(boolean variable),boolean 数据类型用于声明布尔 型变量。boolean 型变量可以是true或false中的一个。例如:
boolean lightsOn * true;
boolean变量的条件赋值:
boolean even = number % 2 == 0
条件选择语句
Java 有几种类型的选择语句:单分支 if 语句、双分支 if-else 语句、嵌套 if 语句、多
分支 if-else 语句、switch 语句和条件表达式。
随机数
可以使用 Math.random() 来获得一个 0.0 到 1.0 之间的随机 double 值,不包 括1.0。
逻辑操作符
逻 辑 操 作 符 ( logical operator ) 也称为布尔操作符 ( boolean operator ), 是对布尔值进行的运算,它会创建新的布尔值。逻辑操作符包括!、&&、||和^。
switch语句
Java 提供 switch 语句来有效地处理多重 条件的问题。
switch语句的完整语法
switch(switch表达式) {
case val1: 语句1;break;
case val2: 语句2;break;
...
case valN: 语句N;break;
default: 默认情况下执行的语句
}
默认情况(default)是可选的,当没有一个给出的case与switch表达式匹配时, 用来执行该操作。关键字 break 是可选的。break 语句会立即终止 switch 语句。
不要忘记在需要的时候使用break语句。一旦匹配其中一个case,就从匹配的case 处开始执行,直到遇到 break 语句或到达 switch 语句的结束。这种现象称为落空行 为(fall-through behavior)。例如,下列代码为第1到 5 天显示 Weekdays, 第 0 和第 6 天显 示 Weekends。
switch (day) {
case 2:
case 3:
case 4:
case 5: System.out.println("Weekday"); break;
case 0:
case 6: System.out.println("Weekend");
}
为了避免程序设计错误,提高代码的可维护性,如果故意省略break, 在case子句 后添加注释是一个好的做法。
常用数学函数
Java 在 Math 类中提供了许多实用的方法,来计算常用的數学函数。具体包括:
- 三角函数方法:sin(radians), cos(radians), tan(radians), toRadians(degree), toDegree(radians), asin(a), acos(a), atan(a);
- 指数方法:Math.exp(x), Math.log(x), Math.pow(a, b), Math.sqrt(x);
- 取整方法:ceil(x), floor(x), rent(x), round(x).
- 其他:min(a, b), max(a, b), abs(x)
- random方法:Math.random()
字符数据类型和操作
字符数据类型 char 用来表示单个字符。字 符型直接量用单引号括住。
char letter = 'A';
char numChar = '4';
Java 支持 Unicode 码,Unicode 码是由 Unicode 协会建立的一种编码方案,它支持使用 世界各种语言所书写的文本的交换、处理和显示。Unicode 码一开始被设计为 16 位的字符 编码。
一个 16 位 Unicod码占两个字节,用以 \u 开 头 的 4 位十六进制数表示,范围
从’\u0000' 到'\uFFFF '。Java程序中,可以使用像 'x' 、'1' 和 '$' 这样的ASCII字符,也可以使用Unicode码。
// 等价的赋值语句
char letter = 'A';
char letter = '\u0041'; // Character A’s Unicode is 0041
// 自增自减也可用于char型变量
char ch = 'a';
System.out.println(++ch);
字符数据和数值数据的转换
// char 型数据可以转换成任意一种数值类型,反之亦然。将整数转换成char型数据时, 只用到该数据的低十六位,其余部分都被忽略。
char ch = (char)0XAB0041; // The lower 16 bits hex code 0041 is // assigned to ch
// 要将一个浮点值转换成 char 型时,首先将浮点值转换成 int 型,然后将这个整型值转换为 char 型。
char ch = (char)65.25;
// 一个 char 型数据转换成数值型时,这个字符的 Unicode 码就被转换成某个特定的数值类型。
int i = (int) 'A';
byte b = '\uFFF4'; // 错误, Unicode码\uFFF4超过了一个字节的范围
byte b = (byte)'uFFF4'; // 正确,用显式转换强制赋值
所有数值操作符都可以用在 char 型操作数上。如果另一个操作数是一个数字或字符, 那么 char 型操作数就会被自动转换成一个数字。如果另一个操作数是一个字符串,字符就 会与该字符串相连。
为了方便,Java 的 Character 类提供了下列方法用于进行字符测试:
isDigit(ch), isLetter(ch), isLetterOrDigit(ch), isUpperCase(ch), toLowerCase(ch),
toUpperCase(ch);
System.out.println("isDigitCa') is " + Character.isDigit('a'));
String类型
为了表示一串字符,使用称为 String ( 字符串)的数据类型。
String message = "Welcome to Java";
String 实际上与 System 类和 Scanner类一样,都是 Java库中一个预定义的类。String 类型不是基本类型,而是引用类型(reference type)。
字符串对象的主要方法:
- length(), charAt(index), concat(s1), tuUpperCase(), toLowerCase(), trim();
- equals(s1), equalsIgnoreCase(s1), compareTo(s1), compareToIgnoreCase(s1), startsWith(prefix), endsWith(suffix), contains(s1);
- Substring(beginIndex, endIndex?), indexOf(ch or s, fromIndex?), lastIndexOf(ch or s, fromIndex?);
- Integer.parseInt(intString), Double.parseDouble(doubleString)
控制台读取字符串
为了从控制台读取字符串,调用 Scanner 对象上的 nextO 方法。
next()方法读取以空白字符结束的字符串('', '\t', '\f', '\r', '\n')。可以使用 nextLine() 方法读取一整行文本。nextLine() 方法读取以按下回车键为结束标志的字符串。
将数值转换为字符串:
String s = number + "";
格式化控制台输出
可以使用System.out.printf 方法在控制台上显示格式化输出。
常用格式标识符:
%b, bool值;%c,字符; %d, 十进制整数;%f,浮点数;%e, 科学计数法形式的数;%s, 字符串
System.out.printf("%3d#%2s#%4.2f\n", 1234,"Java", 51.6653);// 显示 1234#3ava#51.67
默认情况下,输出是右对齐的。可以在格式标识符中放一个负号(-), 表明该条目在特 定区域中的输出是左对齐的。
System.out.printf("%-8d%-8s%-8.1f \n", 1234, "Java", 5.63);