一个简单的Java应用程序
public class FirstSample
{
public static void main(String[] args)
{
System.out.println("We will not use 'Hello,World!'");
}
}
-
public:访问修饰符(access modifier),用于控制程序的其他部分对这段代码的访问级别
-
class:表明程序中的全部内容都包含在类中
-
FirstSample:类名
命名规则:必须以字母开头,后面可以是字母数字的组合,但不能使用Java保留字
命名规范:类名为以大写字母开头的单词,如果由多个单词组成,则每个单词第一个字母大写
-
源代码文件名必须与公共类的名字相同,并用.java作为拓展名
-
Java区分大小写,main如果写成Main则错误
注释
三种方式
- 最常用:
//
- 长篇注释:
/*
和*/
括起来,不能嵌套 - 自动生成文档:
/**
开始,*/
结束
数据类型
一共8种数据类型:4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char
整型
- Java中,整型的范围与运行Java代码的机器无关,从而解决了移植带来的问题
- 后缀L或l:长整型
- 前缀0x或0X:十六进制
- 前缀0:八进制,容易混淆,尽量别用
- 0b或0B前缀:二进制
- Java7开始,可以在数字间加下划线,方便阅读
注意:Java中没有无符号数
浮点类型
-
后缀F或f:float类型
-
后缀D或d:double类型
-
无后缀:double类型
-
三个特殊的浮点数值:正无穷、负无穷、NaN(不是一个数字)
检测:
if(Double.isNaN(x))
char类型
- 描述了UTF-16编码中的一个代码单元
- 强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元,最后将字符串作为抽象数据类型处理
boolean类型
Java中整数与布尔值之间不能相互转换,区别于C!!!
例:
if(x=0)
在Java中会报错!!
变量
变量名必须是以字母开头并由字母或数字构成的序列,不能出现空格
变量初始化
- 声明一个变量之后,必须用赋值语句对变量进行显式初始化,千万别使用未初始化的变量
- 可以将声明放在代码的任何地方,但尽可能靠近变量第一次使用的地方
常量
用关键字final
指示常量,且只能被赋值一次
static final
表示类常量,在该类的所有方法中可用public static final
表示其他类的方法也可使用该常量
运算符
- 参与
/
操作的两个操作数都是整数时,表示整数除法,否则,表示浮点除法 - 整数除以0会产生异常,而浮点数除以0则会得到无穷大或NAN
数值类型之间的转换
两个数值进行二元操作时,先要将两个操作数转换成同一种类型,然后计算
- 若其中有一个为double,则转成double
- 否则,若其中有一个float,则转成float
- 否则,若其中有一个long,则转成long
- 否则,都被转成int
图中实心箭头表示无精度丢失的转换,虚箭头表示可能有精度丢失
强制类型转换
-
double转int:截断小数部分
-
double转int(舍入):
double x=9.97; int nx=(int)Math.round(x);//round返回long类型
关系和boolean运算符
&&
和||
按照短路方式来求值的:如果第一个操作数已经能确定表达式的值,第二个操作数就不必计算了- Java支持三目运算符
运算符优先级
字符串
从概念上讲,Java字符串就是Unicode字符序列。Java中没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类String
子串
String类的substring方法:从一个较大的字符串中提取出一个子串
String greeting = "Hello";
String s = greeting.substring(0,3);
- 第一个参数:开始的位置
- 第二个参数:不想复制的第一个位置
- 优点:便于计算子串长度
拼接
-
使用
+
拼接两个字符串 -
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串
常用于输出
System.out.println("The answer is "+answer);
不可变字符串
Java中的String类称为不可变字符串
- 字符串内容不可修改
- 字符串可以共享,如果复制一个字符串变量,则原始字符串和复制字符串共享相同的字符,字符串变量类似于c中的
char*
指针 - 当字符串变量被赋予其他值时,Java的垃圾回收机制将把原始字符串回收
检测字符串是否相等
s.equals(t)
:若相等,则返回true,否则返回false,s和t可以是字符串变量,也可以是字符串字面量s.equalsIgnore(t)
:忽略大小写
空串与NULL串
- 空串""是长度为0的字符串,是一个Java对象
- NULL串:String变量中存放一个特殊值null,表示目前没有任何对象与该变量关联
码点与代码单元
-
码点:一个字符所占的空间,如一个UTF-16字符即为一个码点
int cpCount = str.codePointCount(0,str.length());
返回码点数量(实际长度)得到第i个码点:
int index = str.offsetByCodePoints(0,i); int cp = str.codePointAt(index);
-
代码单元:char类型是一个采用UTF-16编码表示Unicode码点的代码单元
int n = str.length();
返回代码单元的数量char first = str.charAt(0);
返回某个位置的代码单元
String API
常用API:
构建字符串
-
先构造一个空的字符串构建器
StringBuilder builder = new StringBuiler();
-
每当需要添加内容时,就调用append方法
builder.append(ch);//添加一个char类型代码单元 builder.append(str);//添加一个字符串
-
需要构建字符串时调用toString方法,得到一个String对象
String completedString = builder.toString();
输入输出
读取输入
-
构建一个Scanner对象,并与”标准输入流“System.in关联
Scanner in = new Scanner(System.in);
-
用Scanner对象实现输入操作
String namee = in.nextLine();//读取输入的一行,包括空格 String firstName = in.next();//读取一个单词(以空白符为分隔符) int age = in.nextInt();//读取一个整数
-
一定要在开头添加:
import java.util.*;
格式化输出
用System.out.printf();
来实现格式化输出,同c语言中的printf用法
控制流程
块作用域
- 块:一对大括号括起来的若干简单的Java语句
- 不能再嵌套的两个块中声明同名的变量,区别于C
确定循环
注意:在循环中检测两个浮点数是否相等需要格外小心
for (double x=0;x!=10;x+=0.1);
该循环永远不会结束,因为0.1无法用二进制精确表示
中断控制流程语句
Java中支持带标签的break语句,标签必须放在希望跳出的最外层循环之前,并且紧跟一个冒号,注意只能跳出语句块,不能跳入
大数值
-
BigInteger类:实现任意精度的整数运算
BigInteger a = BigInteger.valueOf(100);//将普通数值转换成大数值 BigInteger c = a.add(b);//c=a+b; BigInteger d = c.mutiply(b.add(BigInteger.valueOf(2)));//d=c*(b+2);
-
BigDecimal类:实现任意精度的浮点运算
数组
创建数组
-
声明数组变量时,需要指出数组类型(数组元素类型紧跟[ ])和数组变量的名字,然后用new创建数组
int[] a = new int[100];
-
要想获取数组中元素个数,使用
a.length
for(int i=0;i<a.length;i++)
-
创建一个数字数组时,所有元素初始化为0,boolean数组初始化为false,对象数组初始化为null
-
一旦创建了数组就不能改变其大小了
for each循环
-
可以用来依次处理数组中的每个元素,而不必为指定下标值而分心
-
格式
for(elementType x : collection) statment
定义了一个变量x暂存集合中每一个元素,并执行相应的语句
其中colletion必须是一个数组或是一个实现了Iterable接口的类对象
数组初始化以及匿名数组
int[] a = {1,2,3,4,5};//创建数组对象并赋予初始值,不需要调用new
a = new int[]{2,3,4,5,6,7,8};//创建一个匿名数组给原数组重新赋值
命令行参数
public Message{
public static void main(String[] args){
}
}
如果用下面的形式运行该程序
java Message -g cruel world
则
args[0] : "-g"
args[1] : "cruel"
args[2] : "world"
其中程序名并不存储在args数组中
多维数组
-
声明多维数组
int[][] a; a = new int[10][10];
-
二维数组遍历
//双重for循环 for(int i=0;i<a.length;i++) for(int j=0;j<a[i].length;j++) //双重for each循环 for(int[] row:a) for(int value:row)
不规则数组
二维数组相当于是一维数组指针的数组,其中的一维数组指针相互独立,可以自由确定其大小
如下图所示: