第二章 Java语言基础
? Java数据类型
? 运算符与表达式
? 流程控制语句
2.1 Java数据类型
? 基本数据类型
? 类型之间的转换
Java数据类型的分类
? 简单数据类型
Integeral,byte,short,int,long
Floating,float,double
Textual,char
Logical,boolean
? 复合数据类型(对象引用类型)
class
interface
数组
几个概念
1 标识符与保留字
? 标识符 (identifier):在程序中用来标识各变量或者常量的符号。
? 必须由字母、下划线或 $开始,其余字母可以为上述三种字母或者数

? 合法的标识符,
var_list_a
$var2
_var$_2
? 不合法的标识符,
1var
var%
interface
保留字
? 由系统中预定义的,留作专用的标识符。
? 保留字不可以作为标识符。
2 常量与变量
? 常量,恒值的量
? 必须使用 final关键字定义常量,例如
final float COUNT_RATE=0.02;
final int AREA=100;
? 系统提供的常量,Math.PI,Math.E
? 变量
float length=1.11;
int count=20;
2.1.1 基本数据类型
? 整型
? 浮点型
? 字符型
? 布尔型
整型数据
? 分类
byte short int long
字节数 1 2 4 8
数字范围 -128~127 -32768~ -2,147,483,648
32767 ~2,143,483,647
? 表示法
十进制, 12,…
十六进制, 0xC1,0x2A34F5,…,
八进制, 010,…
整型数据的使用
? 默认的整型常量为 int型
x=12;//此处常量 12为 int型
? 对于 long型常量,当值超出了 int范围时,需
要添加后缀” L”
long x=12000000000L;//正确,“l”亦可
long x=12000000000;//错误
long x=12;//正确
整型数据的使用 2
? 对于 byte,short型变量,在赋值时存在两种情
况,
? 如果值不超过规定的范围,不会出现问题
? 如果值超出了规定的范围,会引起语法错误
?例如
byte b=12;//no problem
byte b=256;//error
声明和初始化
? int number; //这是一个声明
long population=100L;//声明变量并且初始化
? 变量在使用之前必须初始化
byte num1=56,num2;
byte num3=num1+num2;//错误,num2未初始化
浮点型
? 分类
float double
字节数 4 8
小数点后 6~ 7 15
有效位数
? 表示法
十进制小数, 0.12,3.14,.56,…
科学计数法, 12E-2,314E-2,56E-2
? 默认的小数都是 double型的
float x=1.2f;//正确
float x=1.2;//错误
字符型数据
? 字符集
?ASCII字符集,1字节,128个字符
?扩展的 ACSII集,256个字符
?Unicode字符集,2字节,0~65535
? char类型占 2字节
? 表示法
? char a=?a?;
char b=“b”; //错误
? 转义字符:为了简便的表达一些常用的特殊
字符而采用的方法,即 \后跟某个字符组合后
被赋予新的意义的字符。常见的如
\u, unicode字符
\t, 制表
\r, 回车
字符串
? 由标准库提供的 String类,并非基本数据类型。每个
被双引号引起来的字符串都是 String类的一个实例
String e=,”;
String greeting=“hello”;
? 串的连接,使用符号,+”把两个字符串连接起来
int answer=2;
System.out.println(“the answer is,+answer);
布尔型数据
? 布尔型数据只有两个值,false和 true。
? 表示,
boolean done=true;
2.1.2 数据类型之间的转换
? 不同类型的数据在进行各类计算和赋值时需
要进行类型转换,转换的原因,
? 数据存储的格式不同,例如整型和浮点型的不同
? 数据在存储空间中所占大小的不同,例如 int型和
long型的字节数不同
不同方向上的转换
类型之间的转换
示例
1 int n=123456789;
float f=n;//有问题,f is 1.23456792E8
2 byte a=12;
int b=a;//不会出现问题
3 float x=1.2f;
double y=x;//no problem
造型( cast)
? int i=25;
byte b=(byte)i;
byte c=i;//wrong,Type mismatch,cannot convert from int to byte
? double x=1.25;
float y=(float)x;// right
float z=x;//wrong,Type mismatch,cannot convert from double to float
1 同类型之间大到小的转换必须造型
1
造型 2
? float x=1.8f;
int n=(int)x;//n=1;
long l=(long)x;
int nn=(int)1.8;
整数
实数
cast
2 任何实数到任何整数的转换必须造型
2
混合运算规则
如果存在 double类型的数据,
则运算的结果为 double;否则
如果存在 float类型的数据,则
运算的结果为 float;否则
如果存在 long类型的数据,则
运算的结果为 long;否则
表达式的结果为 Int
算术混合运算
混合运算
? byte b=1;
short c=2;
short a=b+c;//错误,不能将 int类型直接转换为 short
问:下列语句哪些是正确的,哪些是错误的
1 long x=32000000000
2 int x=24;
byte b=x;
3 byte b=24;
byte b=128;
4 float x=1.2;
5 boolean bDone=0;
6 float x=1.02f;
int n=x;
7 byte b=1;
short c=2;
short a=b+c;
2.2 运算符与表达式
? 算术运算
? 递增和递减运算
? 关系和布尔运算
? 位运算
算术运算
?运算符号,+,-,*,/,%
?0除整数发生异常,除浮点数得到无穷大或
NaN
?简便形式,+=,-=,*=,/=,%=
?18%5=? 5%1=?
自增、自减运算
? 符号,++,--
? 前、后位置的不同
? 单条语句,
i++ ; < == > ++i;
? 表达式中的项
int m=7; int m=7;
int n=++m;< == > int n=m++;
(here,n=8,m=8) (here,n=7,m=8)
解释,m=m+1 n=m
n=m m=m+1
关系和布尔运算
? 关系运算,比较两个数是否相等
? 符号,==,!=,<,>,>=,<=
? 运算结果只能是 true或者 false,例如
3==7 is false
3!=7 is true
布尔运算(逻辑运算)
? 符号:与 (&&),或 (||),非 (!)
? A&&B ----短路求值
x!=0 && (1/x>x+y)
如果 x等于 0,则第二个表达式不会被求值
A||B类似。
? 条件运算
(条件)? E1:E2 (如果条件真,计算 E1,否
则计算 E2)。
E=x<y?x,y //if x<y,E=x; else,E=y;
位运算
? 位运算处理数据的各个独立位。要理解该运
算需要先将数据展成二进制形式。
? 几种位运算方式,
? &:各位进行“与”运算
? |, ……….., 或”运算
? ^,……….., 异或”运算
? ~,……….,取“反”
例子
a,5
b,?c?(99)
0000,0101
0110,0011
a&b 0000,0001
a|b 0110,0111
a^b 0110,0110
~a 1111,1010
(- 6)
~b 1001,1100
屏蔽的例子
int fourthBitFromRight=(n&8)/8;
n,* * * *,* * * *
8,0000,1000
解释:通过适当的 2的幂指数,可以把所有其他
数据位屏蔽掉,而只剩下单独的某一位。
移位运算
? 移位运算
? <<:将运算对象左移指定的位数,低位补 0
? >>:有符号右移运算符,若对象为正,则高位补 0,
否则补 1
? >>>:无符号右移,高位补 0,对 char,byte,short进
行移位运算时,会自动转换成 int
? 位运算符号也可以与 =共同使用,形成
&=,|=,^=,>>=,>>>=,<<=。
移位的例子
public static void main(String[] args) {
int i=-1;
i>>>=10;
byte b=-1;
b>>>=10;
short s=-1;
s>>>=10;
long l=-1;
l>>>=10;
System.out.println(i);
System.out.println(b);
System.out.println(s);
System.out.println(l);
}
结果,
-1, 1111 1111 1111 1111 1111 1111 1111 1111
? 4194303 0000 0000 0011 1111 1111 1111 1111 1111
? -1
? -1
? 18014398509481983
几点说明
?几乎所有的运算符都只能操作基本类型,唯一的例
外是,=”,,==”,“!=”;另外,String类支持,+”和
,+=”。
?在 C和 C++中,一种常见的错误如下,
if(x=y){
//…
}
在 java里,x=y的值不是布尔值,因此不会被当作布
尔结果作条件判断,从而阻止程序的执行。
说明 (2),,Ulcer Addicts Really Like C A lot”,即“溃疡患者特别喜欢
(维生素) C”。
?运算符的优先顺序
助记词 运算符类型 运算符
Ulcer Unary + - ++ –
Addicts Arithemetic(and shift) * / % + - << >>
Really Relational > < >= <= == !=
Like Logical(and bitwise) && || & | ^
C Conditional A > B? X, Y
A Lot Assignment =
2.3 流程控制语句
? 结构化程序设计
? 选择结构
? 循环结构
结构化程序设计
? 三种基本结构
结构化程序设计的特点
1,只有一个入口
2,只有一个出口
3,结构内的每一部分都有机会执行到
4,不存在死循环
块结构
? 一个块(复合语句)是用一对花括号括起的任意数
量的简单 Java语句,例如
public static void main(String[] args)
{
int n;
…,
{
int k;
…,
}
}
块范围
块作用域
? 块结构决定了块内定义的变量的作用域;块可以嵌
套,同时,不可以在嵌套的块内定义已有的变量名。
public static void main(String[] args)
{
int n;
{
int k;// k is only defined up to here
int n;// error – cannot redefine n
}
}
条件语句
? If-else语句是控制程序流程的最基本的形式,其中
else是可选的,可按下述两种形式来使用 if,
if ( bool-expr)
statements;
或者
if (bool-expr)
statements;
else
statements;
简单的 if例子

if(yourSales>=target)
{
performance=“Satisfactory”;
bonus=100+0.01*(yourSales-target);
}
else
{
performance=“Unsatisfactory”;
bonus=0;
}
…,
重复的 if-else选择
? 形如,
if (condition)
statement1;
else if (condition2)
statement2;
else if (condition3)
statement3;
…,
else//最后一个必须是 else
statement;
例子 2
static int test(int testval){//match with target
int result=0;
if(testval>target)
result=-1;
else if(testval<target)
result=1;
else
result=0;
return result;
}
开关语句
? 多个分支结构的判断类型相同时,可以使用 switch语句。
? 形如
switch(int-expr)
{
case val1,block1;
break;
case val2:block2;
break;

default:block;
}
switch语句说明
? 表达式的值必须是整型或者字符型。
? case后的语句可以是多条语句,此时不需要
大括号。
? 每个 case的末尾应该用 break语句结束。
switch语句的例子
1 char grade=?B?;
switch(grade)
{
case ?A?,score=5;
break;
case ?B?,score=6;
break;
case ?C?,score=3;
break;
default,score=0;
}
char grade=?B?;
switch(grade)
{
case ?A?,score=5;
break;
case ?B?,score=6;
//no break
case ?C?,score=3;
break;
default,score=0;
}
2
switch语句的例子
3 char grade=?B?;
switch(grade)
{
default,score=0;
break;
case ?A?,score=5;
break;
case ?B?,score=6;
break;
case ?C?,score=3;
break;
}
4
switch(month) {
case 1,
case 3,
case 7,
days=31;
break;
case 4,
case 6,
days=30;
break;
}
在匹配之后的 case语句都被看
作是语句标号,不再进行匹
配。
循环语句
? 满足条件时,反复执行某段程序。
? 三种循环语句
? while语句
? do-while语句
? for语句
while语句
? while语句在循环刚开始时,会计算一次“布
尔表达式”的值。后来的每一次循环,都会
在开始前重新计算一次。
? 语法形式,
while(bool-expr)
statements;
例子
? 1 while(s=1)//error,Type mismatch,cannot convert from int to boolean
{
i=4;
}
例子 2
//,WhileTest.java
WhileTest {
public static void main(String[] args) {
double r = 0;
while(r < 0.99) {
r = Math.random();
System.out.println(r);
}
}
}
do-while语句
? while和 do-while唯一的区别就是 do-while肯定会至
少执行一次;而在 while循环结构中,若条件第一次
就为 false,那么其中的语句根本不会执行。在实际
应用中,while比 do-while更常用一些。
? 语法格式
do{
statements;
}while(bool-expr);
for循环
? for循环常常被称为计数器循环,在第一次反
复之前要进行初始化。随后,它会进行条件
测试,而且在每一次反复的时候,进行某种
形式的“步进”( Stepping)。
? 语法形式,
for(初始表达式 ; 布尔表达式 ; 步进 )
语句 ;
例子
//,ListCharacters.java
// Demonstrates "for" loop by listing
// all the ASCII characters,
public class ListCharacters {
public static void main(String[] args) {
for( char c = 0; c < 128; c++)
if (c != 26 ) // ANSI Clear screen
System.out.println(
"value," + (int)c +
" character," + c);
}
}
说明
? 可以在 for语句里定义多个变量,但它们必须
具有同样的类型,例如
for(int i = 0,j = 1; i < 10 && j != 11; i++,j++)
/* body of for loop */
说明 2
? 逗号表达式:使用逗号连接的各表达式按照顺序进行计算。
? 例
//,CommaOperator.java
public class CommaOperator {
public static void main(String[] args) {
for(int i = 1,j = i + 10; i < 5; i++,j = i * 2) {
System.out.println("i= " + i + " j= " + j);
}
}
}
输出如下,
i= 1 j= 11
i= 2 j= 4
i= 3 j= 6
i= 4 j= 8
中断与继续
? 在任何循环语句的主体部分,可用 break和
continue控制循环的流程。其中,break用于
强行退出循环,不执行循环中剩余的语句。
而 continue则停止执行当前的循环,然后退
回循环起始处,开始新的反复。
? 如果在 for循环里使用 continue,那么它会跳
转到 for循环的”步进“部分。
while(years<=100)
{
balance+=payment;
double interest=balance*interestRate/100;
balance+=interest;
if(balance>=goal)
break;
years++;
}
labelled break
int n;
read_data,
while(...)
{
,.,
for(...)
{
,.,
if(n<0)
break read_data;//break out of loop
}
,.,
}
例子
//BreakandContinue.java
public class BreakandContinue{
public static void main(String[] args) {
for(int i=0;i<100;i++){
if(i==74)
break;
if(i%9!=0)
continue;
System.out.println(i);
}
}
}
执行结果
? 0
? 9
? 18
? 27
? 36
? 45
? 54
? 63
? 72
程序设计举例
? 例 1----标准输出
//文件 BasicJava.java
public class BasicJava{
public static void main(String[] args){
System.out.println(“Hello,world”);
System.out.print(“Hello”);
System.out.print(“world”);
}
}
System类是标准 Java类,位于
java.lang包内。
out是 System类的一个静态成
员,它是一个输出流对象,
流用来控制键盘,显示器等
输入输出设备。
,是 Java的选择器,表示选择
类或对象的某个成员。
在屏幕输出文字串可以使用 out
对象的 print/println方法,
println:输出一行后,光标移到下一
行。
print,输出一行之后,光标停留在
行尾。
输出结果,
Hello,world
Hello World
Press any key to continue…,
? 例 1a----println的使用以及字符串连接
public class BasicJava{
public static void main(String[] args){
System.out.println(1);//打印整数 1
System.out.println(1+2+"D Graphics");
System.out.println("Java"+1+1);
}
}
A println提供重载版本,允
许接受以下几类参数,
1 所有基本类型
2 字符串类型 String
3 Object对象类型
B 当参数为字符串类型时,
允许通过,+”来连接字符
串和其他类型
1 int+ int +,…”;
此时先做加法,再完成连接
2,….” +int +int
输出结果,
1
3D Graphics
Java11
? 例 1b----打印多行文字
public class BasicJava{
public static void main(String[] args){
System.out.println(“Java is an object
oriented programming language");//error
System.out.println(“Java is an object”
+”oriented programming language”);//right
}
}
一条 Java语句可以分
行,但不允许作为
参数的字符串分行
? 例 2---简单计算:摄氏温度转换成华氏温度
public class BasicJava{
public static void main(String[] args){
//Temperature transition
int celsius=20;
int fahrenheit=32+(9*celsius)/5;
System.out.println("Celsius Temperature,"+celsius);
System.out.println("Fahrenheit Temperature:"+fahrenheit);
}
}
Result,
Celsius Temperature:20
Fahrenheit Temperature:68
如果转换公式写成下面会怎么样?
fahrenheit=32+(9/5)*celsiut
? 例 2a---简单计算 ---大小写字母转换
public class BasicJava{
public static void main(String[] args){
//大小写转换
char lowerChar=?c?;//或者 lowerChar=99;
char upperChar=?c?-32;//方式 1
int upperChar2=(?A?-?a?)+lowerChar;//方式 2,等号右边是 int型
System.out.print(“Character "+lowerChar);
System.out.println("\'s uppercase letter is "+(char)upperChar);
}
}
Character c?s uppercase letter is C
…,
? 例 2a---简单计算 -----英镑和公斤转换
public class BasicJava{
public static void main(String[] args){
final double KILOGRAM_PER_POUND=0.454;
//KILOGRAM_PER_POUND=1.0;//error,常量不能被修改
double weightInPounds=75.5;
double weightInKilo=weightInPounds*KILOGRAM_PER_POUND;
System.out.println("A weight in Pounds "+weightsInPounds);
System.out.println("is equal to
Kilograms"+Math.round(weightsInKilo));
}
}
声明常量使用 final关
键字。常量采用大
写字母加下划线的
形式。
round方法返回浮点
数的四舍五入值 。
? 例 3---输入流
要使用输入流,需要创建一个 BufferedReader类的对象,
1 该类位于 java.io包内,因此需要一条 import语句。
2 创建一个对象使用 new 运算符
BufferedReader stdin=new BufferedReader(
new InputStreamReader(System.in));
在这个过程里,用到了一个 InputStreamReader对象,而该对象又需要通过一个
System.in变量来创建;
3 使用输入流可能会造成异常,比如一次非法的输入,因此需要
一条声明程序可能会抛出异常的语句。
public static void main(String[] args) throws IOException {
? 例 3---输入流
import java.io.*;
public class BasicJava{
public static void main(String[] args) throws IOException{
….,
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
double pounds=Double.parseDouble(stdin.readLine());
double weight=pounds*KILOGRAM_PER_POUND;
System.out.println("The pounds "+pounds+" is "+weight+" kilograms");
}
}
? 例 3---输入流 ----方法说明
1 BufferedReader类提供了 readLine方法,该方法可以从输入
流中截取字符串,
readLine等待用户输入,将全部输入作为字符串返回,并且不
包括用户最后的换行符。
String input= stdin.readLine();
2 将字符串转换成其他类型的方法,
double pounds= Double.parseDouble(input);
这里需要使用到 double类型的包装类 (wrapper)Double,该类
位于 java.lang包内,它提供了一个静态方法 parseDouble,可
以从字符串中析取出一个浮点数。
对于整型,
int pounds=Integer.parseInt(input);