目录
2.1 标识符、关键字和数据类型
2.2 表达式和运算符
2.3 语句与流程控制
2.4 数组
2.1 标识符、关键字和数据类型
⒈逻辑类型:boolean ⒉字符类型:char ⒊整数类型:byte、short、int和long ⒋浮点类型:float和double
除了基本数据类型之外,Java语言中还允许定义引用数据类型,这其中包括数组、类类型和接口类型,将在后面的相应章节中分
别介绍。
类型转换
将一种数据类型转换到另外的一种数据类型,称为类型转换。类型转换有两种:自动类型转换(隐式类型转换)和强制类型转换
(显式类型转换) 。
经过类型转换,指定变量本身不会发生任何变化。强制类型转换可能会造成数据超出较短数据类型的取值范围,造成“溢出”。[
布尔型不能转换]
class Test
{
public static void main(String[] args)
{
int i =255;
byte b = 127;
b = (byte)i;
System.out.println(i);
System.out.println(b);
}
}
结果是:
255
-1
分析:
int i = 255
既是00000000 00000000 00000000 11111111
截断8位,成 11111111
怎么成了-1了呢?
计算机为了方便计算, 把所有的负数转换成正数, 也就是取补码。负数的转换方法为: 符号位不变, 其余位取反, 再 +1。
byte 的-1 表示成 10000001
取反 11111110
+1 11111111
2.2 表达式和运算符
Java语言的运算符基本上继承了C和C++的运算符体系,从形式到功能,包括优先级和结合性与C和C++的运算符非常相似。Java语言继承了大部分C和C++的运算符,多数运算符都保持了原有的定义。
Java语言取消了结构体成员运算符“->”,指针运算符“*”和“&”,长度运算符“sizeof”。
⒈成员运算符和分隔运算符
. () [] ; ,
⒉ 算术运算符
一元算术运算符:++ -- -
二元算术运算符:+ - * / %
⒊ 强制类型转换符
(type)expression
对象运算符“instanceof”
使用格式为
instancename instanceof classname
其涵义为测试instance是否为类classname的对象实例,是则返回true,否则返回false。
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
提醒学习过C和C++的人特别注意,整型数据与逻辑型数据不存在互换关系。
Java语言改变了C和C++中对下面6个运算符的定义。
“!”运算符将原有的“逻辑非”运算修改定义为对逻辑数据的“逻辑非”运算;
“&”运算符将原有的“按位与”运算修改定义为对两个整数的“按位与”运算和对两个逻辑数据的“逻辑与”运算;
“|”运算符将原有的“按位或”运算修改定义为对两个整数的“按位或”运算和对两个逻辑数据的“逻辑或”运算;
“^”运算符将原有的“按位异或”运算修改定义为对两个整数的“按位异或”运算和对两个逻辑数据的“逻辑异或”运算;
“&&”运算符将原有的“逻辑与”运算修改定义为对两个逻辑数据的“逻辑与”运算;
“||”运算符将原有的“逻辑或”运算修改定义为对两个逻辑数据的“逻辑或”运算。
需要提醒,“&&”和“||”在计算逻辑值时,如果仅靠左运算数即可判定运算结果时,右运算数的值将不被计算,所以它们也被称为
“条件与”和“条件或”。而“&”和“|”在计算逻辑值时,总是将两个运算数的值都计算出来之后再作逻辑运算,这是它们的差别
所在。
& 和 && 举例
class Test
{
public static void main(String[] args)
{
int i=1;
int j=1;
if(i++ <0&j++>0)
{ }
System.out.println(j);
i=0;
j=1;
if(i++ <0&&j++>0)
{ }
System.out.println(j);
}
}
结果是:
2
1
2.3 语句与流程控制
一、结构化程序设计中的三种控制结构
■顺序结构
■选择结构:单选择结构、双选择结构、多选择结构
■循环结构
二、选择语句
⒈if-else语句
if(boolean_expression)
statement_or_block
else
statement_or_block
⒉switch语句
switch(expression){
case const1:statements;break;
case const2:statements;break;
......
default:statements;
}
其中expression只能是整数类型或字符型,不能是浮点类型。
switch语句使用举例:
public class Switch {
public static void main(String[] args){
int x=0;
switch(x){
default:
System.out.println("default");
case 1:
System.out.println(1);
case 2:
System.out.println(2);
}
}
}
结果:
default
1
2
public class Switch {
public static void main(String[] args) {
int x = 0;
switch (x) {
default:
System.out.println("default");
case 0:
System.out.println(0);
case 1:
System.out.println(1);
case 2:
System.out.println(2);
}
}
}
结果:
0
1
2
public class Switch {
public static void main(String[] args) {
int x = 0;
switch (x) {
case 0:
System.out.println(0);
case 1:
System.out.println(1);
case 2:
System.out.println(2);
default:
System.out.println("default");
}
}
}
结果:
0
1
2
default
总结:
switch表达式的值决定选择哪个case分支,如果找不到相应的分支,就直接从"default" 开始输出。
当程序执行一条case语句后,因为例子中的case分支中没有break 和return语句,所以程序会执行紧接于其后的语句。
三、循环语句
⒈for循环语句
for(init_expr; boolean; alter_expr)
statement_or_block
⒉while循环语句
while(boolean)
statement_or_block
⒊do-while循环语句
do
statement_or_block
while(boolean)
四、break语句和continue语句
不带label的break语句为跳出一个语句层;
带label的break语句的格式为
Break label
label为一个标识符,标定一条语句,带label的break语句的用法的作用是跳出label所标定的块。
不带label的continue语句与C和C++中完全一样,可以结束某个循环中的一个周期的剩余部分,开始下一个循环;
带label的break语句的格式为
continue label
这里的label仍然是一个标定语句的标识符,带label的continue语句的作用是结束标号指定的循环中的一个周期的剩余部分,开始下
一个循环。
计算素数
public class PrimeNumber{
public static void main(String args[]){
int n = 0;
outer: for(int i=101;i<200;i+=2){ //外层循环
for(int j=2; j<i;j++){ //内层循环
if(i%j==0)
continue outer; //不能使用 "break" ,为什么?
}
System.out.print(" " + i);
n++;
if(n<6 )
continue;
System.out.println(); //输出六个数据后换行
n = 0;
}
}
}
五、return语句
这个语句用在方法体中,它的作用是返回一个与方法的返回类型一致的一个类型给方法的调用,用法格式为
return variable_or_expression
2.4 数组
在Java语言中,数组是一种最简单的引用数据类型,数组实际上是一组变量或对象实例,其类型是相同的。
可以在程序中声明各种基本类型和引用类型的数组。
与C和C++相似,Java语言数组在使用时须经过声明、创建、初始化三个步骤。
一、数组的声明、创建、初始化与释放
数组的声明是定义数组变量标识符,Java语言支持两种完全等价的声明格式:
格式一: char s[]; Point p[];
格式二: char[] s; Point[] p;
注意:Java语言在声明数组时不允许指定数组大小。
数组的创建是为数组的元素分配存储空间并进行自动初始化,创建数组使用“new”关键字,格式如下:
char[] s; s = new char[10];
或者将声明和创建连在一起完成,如
char[] s = new char[10];
数组的变量标识符是一个引用,数组的创建使得这个引用指向存储数组的内存的首地址。
除了自动初始化之外,还可以采用赋值初始化和静态初始化的方法。赋值初始化方法即通过执行语句为数组的元素赋值。静态初始化
即是用大括号将数组元素的值一一列出的方式,即形如
char[] s = {‘a’ , ‘c’ , ‘d’ , ‘f’};
的形式。
数组的释放不需要程序员显式地操作,不再使用的数组由系统作为垃圾自动处理。
二、多维数组
在Java语言中没有多维数组,而是通过定义数组的数组实现多维数组,多维数组的声明、创建和初始化与一维数组相似,如
int twoDim[][] = new int[4][];
即声明和创建了一个有4个元素的数组,每个元素都是一个数组。
特别要指出的是,Java语言与其他高级语言不同,其多维数组的每一维的长度可以不同。即在上面数组定义基础上,二维数组可以如
下初始化
twoDim[0] = new int[4];
twoDim[1] = new int[2];
twoDim[2] = new int[3];
twoDim[3] = new int[4];
三、数组边界与数组元素的访问
数组长度length是Java语言中规定的一个只读量,作为数组的一部分与数组一同存储,可通过数组名访问该量。如twoDim[0].length
即代表数组twoDim[0]的长度。
在Java语言中,数组下标必须是整数类型的常量、变量或表达式,其值必须不超出0到length-1的范围,否则运行时将产生一个
ArrayIndexOutofBoundsException。
正是因为有了数组长度变量的作用, Java语言多维数组才可以将其每个元素即子数组定义成互相不同的长度,实际上是其每一个子
数组都自己记录了长度信息。
Java语言的这个规定要比C和C++中关于数组的访问要严格得多,这一点体现了Java语言安全性的特点。