3.1 一个简单的Java应用程序
public class FirstSample
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
在这里,使用了 System.out 对象并调用了它的 println 方法。注意, 点号( • )用于调用方法。Java 使用的通用语法是:
object.method(parameters);
这等价于函数调用。
注意:
- Java 区分大小写。
- 关键字 public 称为访问修饰符(access modifier), 这些修饰符用于控制程序的其他部分对这段代码的访问级別。(详情见第5章)
- 关键字 class 后面紧跟类名。名字必须以字母开头,后面可以跟字母和数字的任意组合。长度基本上没有限制。
- 源代码的文件名必须与公共类的名字相同,并用 .java 作为扩展名。
- 如果已经正确地命名了这个文件, 并且源代码中没有任何录人错误,在编译这段源代码之后就会得到一个包含这个类字节码的文件。Java 编译器将字节码文件自动地命名为FirstSample. class, 并与源文件存储在同一个目录下。
- 根据 Java 语言规范, main 方法必须声明为 public。
- 每个句子必须用分号结束。
Java与C++:
- Java 中的所有函数都属于某个类的方法(标准术语将其称为方法, 而不是成员函数)。因此,Java 中的 main 方法必须有一个外壳类。
- Java 中的 main 方法必须是静态的。
- 如果 main 方法正常退出, 那么 Java 应用程序的退出代码为 0,表示成功地运行了程序。如果希望在终止程序时返回其他的代码, 那就需要调用
System.exit
方法。
3.2 注释
有三种注释方式:
- //:其注释内容从
//
开始到本行结尾 - /**/:使用
/* */
将一段比较长的注释括起来。 - 第 3 种注释可以用来自动地生成文档。这种注释以
/**
开始, 以*/
结束。
注意:在 Java 中,/* */
注释不能嵌套。 也就是说, 不能简单地把代码用 /*
和 */
括起来作为注释, 因为这段代码本身可能也包含一个 */
3.3 数据类型
整型
- int
- short
- long
- byte
长整型、十六进制、八进制、二进制 - 长整型后缀L或l
- 十六进制前缀0x或0X
- 八进制前缀0
- 二进制前缀0b或0B
Java整型数据范围的可移植性
一些加下划线_的操作
注意, Java 没有任何无符号(unsigned) 形式的 int、 long、short 或 byte 类型。
浮点类型
用十六进制表示浮点数
溢出或出错
对NaN的判断
二进制无法精确表示部分小数
char类型
特殊字符的转义序列
转移序列在解析代码之前处理产生的错误
尽量不要使用char
boolean
boolean (布尔)类型有两个值:false 和 true, 用来判定逻辑条件。
整型值和布尔值之间不能进行相互转换。
3.4 变量
对变量的声明
double salary;
int vacationDays;
一些命名小技巧
变量初始化
初始化的两种方式:
C++区分声明和定义,但Java不区分
final常量与static final类常量
在 Java 中, 利用关键字 final 指示常量。
关键字 final 表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。
在 Java 中,经常希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量。可以使用关键字 static final设置一个类常量。
类常量的定义位于 main方法的外部。因此,在同一个类的其他方法中也可以使用这个常量。
而且,如果一个常量被声明为 public,那么其他类的方法也可以使用这个常量。
C++注释:
const 是 Java 保留的关键字,但目前并没有使用。
在 Java 中,必须使用 final定义常量。
3.5 运算符
数值类型之间的转换
在进行二元操作时(如±*/),操作数要转换为同一数据类型。
判断顺序为:
- double
- float
- long
- int
强制类型转换
可以转,但是可能会丢失精度,如double转为int,那么会强制截断小数。
如果想对浮点数进行四舍五入,则可以用Math.round
方法。
对于目标数据类型溢出了:
这里byte最大表示为256,且300-256=44.
注意:不要在 boolean 类型与任何数值类型之间进行强制类型转换。
结合赋值、自加自减操作与C++规则一样
关系与boolean运算符
==
表示等于,!=
表示不等于
三元操作符?:
位运算符
应用在布尔值上时, & 和丨运算符也会得到一个布尔值。
这些运算符与 && 和 || 运算符很类似,不过 & 和丨运算符不采用“ 短路” 方式来求值, 也就是说,得到计算结果之前两个操作数都需要计算。
运算符的优先级
枚举类型
3.6 字符串
字串substring
可以理解为:左闭右开。
拼接+
用+号拼接:
int age = 13;
String rating = "PG" + age;
//rating 为 PG13
用join方法拼接:
不可变字符串
String 类没有提供用于修改字符串的方法。
由于不能修改 Java 字符串中的字符, 所以在 Java 文档中将 String 类对象称为不可变字符串。
当然, 可以修改字符串变量。
不可变字符串却有一个优点:编译器可以让字符串共享。
检测字符串是否相等
可以使用 equals
方法检测两个字符串是否相等。
s.equal(t);
如果相等则返回true,否则返回false。
要想检测两个字符串是否相等,而不区分大小写, 可以使用equalsIgnoreCase
方法。
不能用==来判断String是否相等
空串与NULL串
码点与代码单元
String API
一些常用的API:
目前来讲都看不懂
构建字符串
StringBuilder类中常用的的重要方法:
3.7 输入输出
输出:调用System.out.println
输入:
首先需要构造一个 Scanner 对象,并与“ 标准输人流” System.in 关联。
Scanner in = new Scanner(System.in);
import java.util.*;
public class temp
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
//name
System.out.println("What is your name?");
String name = in.nextLine();
//age
System.out.println("How old are you?");
int age = in.nextInt();
//output
System.out.println("Hello, "+name+" you are "+age);
}
}
输出:
关于读取密码用的Console
一些方法:
格式化输出
用于printf的转换符:
printf方法中日期与时间的格式化选项
格式说明符语法
文件输入与输出
3.8 控制流程
块作用域
块(即复合语句)是指由一对大括号括起来的若干条简单的 Java 语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。
不能在嵌套的两个块中声明同名的变量。
条件语句
循环
while先检测循环条件,再执行。
do while先执行,再检测。
for 循环语句是支持迭代的一种通用结构, 利用每次迭代之后更新的计数器或类似的变量来控制迭代次数。
循环与浮点数:
多重选择:switch
break
不带标签的break:跳出循环。
带标签的break:跳出多重嵌套的循环语句。
如for循环有一个标签tar,如果满足if条件就会跳出for循环,因为break tar了。
public static void main(String[] args)
{
tar:
for(int i = 0;i < 10; i++)
{
if(i > 5) break tar;
System.out.println(i);
}
}
注意: 只能跳出语句块,而不能跳入语句块。
continue语句:将控制转移到最内层循环的首部。
还有一种带标签的 continue 语句,将跳到与标签匹配的循环首部。
3.9 大数值
Biglnteger
类实现了任意精度的整数运算, BigDecimal
实现了任意精度的浮点数运算。
一些API:
试一下BigInteger的威力:
import java.util.*;
import java.math.*;
public class temp
{
public static void main(String[] args)
{
int a = 2000000000;
BigInteger ans = BigInteger.valueOf(0);
BigInteger b = BigInteger.valueOf(a);
for(int i = 0;i < 10; i++)
{
ans = ans.add(b);
}
//会溢出
System.out.println(10*a);
//不会溢出
System.out.println(ans);
}
}
输出:
-1474836480
20000000000
3.10 数组
for each循环
for (variable : collection) statement
类比于C++的for(auto u:v)
数组初始化以及匿名数组
数组拷贝
Java与C++的初始化:
命令行参数
每一个 Java 应用程序都有一个带 String arg[]参数的 main 方法。这个参数表明 main 方法将接收一个字符串数组, 也就是命令行参数。
数组排序
对a数组进行快速排序:
int[] a= new int[10000];
...
Arrays.sort(a);
一些数组API:
多维数组