第二讲 Java中的数据和运算
主要内容 Java输入输出的初步运用 Java的标识符和保留字 Java的基本数据类型 Java基本数据类型转换 Java中的运算符 |
问题:读取一个整数,输出该数的平方
算法
步骤一:读取一个整数字符串
步骤二:将字符串转换成整数Integer.parseInt(s)
步骤三:运算处理
步骤四:输出结果
程序清单[Square.java]
import javax.swing.*;
public class Square{
public static void main(String args[]){
String s=JOptionPane.showInputDialog("请输入一个整数:");
int n=Integer.parseInt(s);
int m=n*n;
System.out.println("你输入的数是:"+s);
System.out.println("其平方值是:"+m);
}
}
程序解析
² JOptionPane是javax.swing包中的类
² showInputDialog是JOptionPane的方法:显示一个输入对话框
² System.out.println(…):显示输出。
[注意]可以“+”号连接不同类型数据。
思考 1. 如何交互输入数据? 2. 用JoptionPane的showInputMessage方法输入的是什么类型的数据? 3. 一个数字组成的字符串如何转化成整数? 4. Java程序如何向字符窗口输出数据? |
练习:输入一个圆半径,输出其面积。
标识符的定义规则
在Java程序中,包、类、属性、方法、对象、变量、符号常量、数组等等都要有名称。这名称即为“标识符”。
标识符的定义规则:
² 由字母、数字、_和$组成
² 开头字符必须是字母、下划线或$(不可以数字开头)
[注意]大小写敏感。myname与Myname是两个不同的标识符。
定义三原则:见名知义、规范大小写、不可用Java保留字
练习:从以下字符串中挑出合法的Java标识符。
2tow |
Mary5 |
else |
Hello world |
bob |
do |
cheese_eat |
Hello! |
保留字(关键字)
保留字(reserved word):是 Java 语言规定了特定含义的标识符。
对于保留字,用户只能按照系统规定的方式使用,不能自行定义。
保留字一律用小写字母表示。
abstract |
for |
private |
break |
finally |
return |
byte |
final |
static |
boolean |
if |
switch |
catch |
import |
short |
case |
implements |
synchronized |
class |
instanceof |
super |
char |
interface |
try |
continue |
int |
true |
do |
length |
this |
default |
long |
throw |
double |
new |
threadsafe |
else |
null |
throws |
extends |
native |
transient |
false |
package |
void |
final |
public |
while |
float |
protected |
…… |
指定变量的数据类型可确定变量所需分配的内存尺寸。
char ch;
float x;
int a,b,c;
布尔型——boolean
布尔型常量:true和false (它们不对应于任何整数值!)
布尔型变量的定义如:boolean b=true;
字符类型——char
字符常量:用单引号括起来的一个字符,如‘a’,‘A’;
与C相同,Java也提供转义字符,如下图:
转义字符 |
描述 |
\ddd |
1到3位8进制数所表示的字符(ddd) |
\uxxxx |
1到4位16进制数所表示的字符(xxxx) 如\u0061表示’a’ |
\' \" |
单引号字符和双引号字符 |
\\ |
反斜杠 |
\r |
回车 |
\n |
换行 |
\t |
横向跳格 |
\f |
走纸换页 |
\b |
退格 |
字符型变量的定义如:char c=‘a’;
说明:Java中的字符型数据是16位无符号型数据,它采纳Unicode集。
练习:编程测试16进制数41,51对应的字符,并相隔一个tab位输出。
整型
整型常量可用三种进制表示:
十进制整数:如:123,-456,0
八进制整数:0ddd (注意:ddd<=377)
如0123表示十进制数83,-011表示十进制数-9。
十六进制整数:以0x或0X开头
如0x123表示十进制数291,-0X12表示十进制数-18。
练习:分析程序运行结果。
public class DataTest{
public static void main(String[] args){
int x=010;
System.out.println("x="+x);
int y=0x10;
System.out.println("y="+y);
}
}
整型变量有byte、short、int、long
数据类型 |
字节数 |
所占位数 |
数的范围 |
byte |
1 |
8 |
-27~27-1 |
short |
2 |
16 |
-215~215-1 |
int |
4 |
32 |
-231~231-1 |
long |
8 |
64 |
-263~263-1 |
注意:在进行处理时应注意变量的范围
byte x=129; 出错!
byte x=(byte)129; 结果x的取值是-127
原因:整数在内存中以补码保存。129—10000001-- -127
思考 1. 在Java中一个字符数据开销字节数? 2. 在Java中怎样给出一个八进制整常数? 3. 在Java中怎样给出一个十六进制整常数? 4. 在Java中如何输出数据? 5. Java表达整型的数据类型与C相比异同点? |
浮点型(实型)
实型常量有两种表示形式
² 十进制数形式:由数字和小数点组成,如0.123, .123, 123.,123.0
² 科学计数法形式:如:123e3或123E3
其中e或E之前必须有数字,且e或E后面的指数必须为整数。
说明:单精度常量以f或F为后缀。双精度常量以d或D作后缀(默认)。
实型变量
数据类型 |
所占位数 |
数的范围 |
float |
32 |
3.4e-038~3.4e+038 |
double |
64 |
1.7e-308~1.7e+308 |
字符串型
字符串常量是用双引号作为起止符的字符序列。如:”Hello”
字符串变量定义如:String s1,s2; String s1=”Hello”;
练习:试分析下面程序中的各变量
public class Assign {
public static void main(String[] args){
int x , y ;
float z = 1.234f ;
double w = 1.234 ;
boolean flag = true ;
char c ;
String str ;
请加入语句: 在第一行输出x、y、z、w的值 在第二行输出c、flag、str的值
|
c = 'A';
str ="bye";
x = 12 ;
y = 300;
}
}
思考 1. 如何给出一个单精度常数? 2. 字符常量和字符串的定界符分别是什么? 3. 在Java中一个int型数据开销字节数? 4. 在Java中用什么类型的变量存储一个逻辑值? |
Java基本数据类型转换
自动类型转换
整型、实型、字符型数据可以混合运算。步骤:先转化为同一类型,再运算。
转换总是从低级到高级,按下图所示:
低--------------------------------------------->高
byte,short,charà int à long à float à double
思考 1、x+y的值是什么类型? 2、x+y+z的值是什么类型? 3、a+b的值是什么类型? 4、a-x-y的值是什么类型? 5、x+c是值是什么类型? |
int x;
byte y;
long z;
float a;
double b;
char c;
强制类型转换
高级数据要转换成低级数据,需用到强制类型转换,如:
y=(byte)x;
x=(int)(a+b);
a=(float)b;
阅读程序,分析运行情况
public class CharandInt1{
public static void main(String[] aa){
char y='a';
System.out.println(y);
}
}
public class CharandInt2{
public static void main(String[] aa){
int x=2;
char y='a';
System.out.println(y+x);
}
}
[思考] 如何修改程序使之输出结果为”c”?
class Test1{
public static void main(String[] aa){
char a='\u0041';
int b=a;
float c=b;
double d=c;
System.out.println(a+"\t"+b+"\t"+c+"\t"+d);
}
}
class Test2{
public static void main(String[] aa){
double e=65.5;
float f=e;
int g=f;
char h=g;
System.out.println(e+"\t"+f+"\t"+g+"\t"+h);
}
}
算术运算符
双目运算符
运算符 |
示例 |
含义 |
+ |
op1 + op2 |
加法运算 |
- |
op1 - op2 |
减法运算 |
* |
op1 * op2 |
乘法运算 |
/ |
op1 / op2 |
除法运算 |
% |
op1 % op2 |
模运算(取余) |
说明:
1)JAVA对“+”运算进行了扩展,字符串连接、数字与字符串连接
如: String s;
s="s="+4*5;
2) JAVA中的"%"取模运算,可对浮点数进行。符号同第一个操作数。
如52.3%10à2.3
class TestMod{
public static void main(String[] aa){
System.out.println(10%3);
System.out.println(10%-3);
System.out.println(-10%3);
System.out.println(-10%-3);
}
}
自增自减运算符
运算符 |
示例 |
含义 |
前缀 ++ |
++ x |
加 1 后再引用 |
前缀 -- |
-- x |
减 1 后再引用 |
后缀 ++ |
x ++ |
先引用,再加 1 |
后缀 -- |
x -- |
先引用,再减 1 |
说明:
1) ++与--运算符只能用于变量。错例:5++,++(a+b)
2) ++与--运算时结合方向自右向左。-i++相当于-(i++)
3) 两个+号(或-号)之间不能有空格
4) 应避免使用复杂的表达式
算术表达式:用算术运算符与括号将运算对象连接起来的、符合Java规则的式子。
运算级别:先*、/、%后+、-,“左结合”原则。如:n * -2, -n / -2
赋值运算符
基本赋值运算
形式: <变量> =<表达式>
作用:将右边表达式的值计算赋给左边的变量。
赋值语句:赋值表达式加上分号即可。
public class S3 {
public static void main(String[] args){
int a;
int b;
int c=(a=5)+(b=13);
System.out.println(a+" "+b+" "+c);
}
}
复合赋值运算
形式: <变量><简单运算符>=<表达式>
à<变量>=<变量><简单运算符>(<表达式>)
分别举例:
运算符 |
示例 |
含义 |
+= |
count += 2 |
count = count + 2 |
-= |
count -= 2 |
count = count - 2 |
*= |
count *= 2 |
count = count * 2 |
/= |
count /= 2 |
count = count / 2 |
类型转换
赋值时如果赋值号两边类型不同,则有如下两种可能:
² 自动转换。条件:等号右式类型比左边变量类型简单。
² 出错。 出错信息: possible loss of precision
关系运算符
运算符 |
示例 |
含义 |
== |
op1 == op2 |
等于 |
!= |
op1 != op2 |
不等于 |
< |
op1 < op2 |
小于 |
> |
op1 > op2 |
大于 |
<= |
op1 <= op2 |
小于等于 |
>= |
op1 >= op2 |
大于等于 |
注意:
[1] "= ="不要写成"="
关系表达式
op1 <关系运算符> op2
说明:
1) Java中,任何类型的数据(包括简单类型和复合类型),都可以通过"=="或"!="来比较是否相等。
2) 浮点数的比较小心慎用
3) 不同类型的数值量以及字符之间可以进行各种大小比较
class T1{
public static void main(String[] aa){
char x='4';
int y=4;
if (x==y)System.out.println(y);
else System.out.println((char)y);
}
}
4) 关系运算的结果是true和false(而不是1或0、T或F!)
5) 关系运算符优先级低于算术运算符,高于赋值运算符
逻辑运算符
运算符 |
示例 |
含义 |
&& |
op1 && op2 |
逻辑与 |
|| |
op1 || op2 |
逻辑或 |
! |
! op |
逻辑非 |
1) 逻辑运算的截断性。
class Test {
public static void main(String[] args){
int f=0;
if (f!=0 && 3/f>5)System.out.println("111");
else System.out.println("000");
}
}
思考:表达式 f!=0 && 3/f>5是否会发生除0溢出错误?
2) 优先级如下图示(从高到低)
! 算术运算 关系运算 && || = |
条件运算符(? : )
e1? e2:e3
意义:若e1为真,则取值e2;为假取值e3。
例:
int a=1;
int b=4;
int max=a>b?a:b;
说明:
1) e1的类型必须为boolean型
2) e2与e3有相同的数据类型
练习:输入三个整数,输出其中的最大数(MaxValue.java)。
Java运算符的优先级
运算符的优先级
|
() |
高 |
|
++ -- ! 单目+ 单目- |
|
|
* / % |
|
|
+ - |
|
|
< > <= >= |
|
|
= = != |
|
|
&& |
|
|
|| |
|
|
? : |
|
|
= += -= *= /= %= |
低 |
变量的作用域
即变量何时可访问,何时不能。有如下几个要点:
² 方法中声明的变量只在方法内访问
² 花括号内的变量在花括号里,及其内含的花括号里可访问
class T1{ public static void main(String[] aa){ { int x=1; System.out.println(x); x++; } System.out.println(x); } } |
练习:输入一个半径(实数),输出圆面积。
import javax.swing.*;
public class CircleArea{
public static void main(String[] args){
String s=JOptionPane.showInputDialog("请输入半径:");
float r=Float.parseFloat(s);
System.out.println(a);
}
}
实验一
1. 调试一个例程,理解Java程序的编辑、编译和执行方法。试观察源程序文件、字节码文件的扩展名。
2. 读取一个实型数,输出该数的平方。
3. 输入一个姓名,输出“Welcome, <姓名>”
4. 分析和调试程序,初步理解日期信息的获取:
import java.util.*;
public class Day {
public static void main(String[] args){
Calendar c= Calendar.getInstance();
System.out.print("今天的日期是:");
int y=c.get(c.YEAR);
int m=c.get(c.MONTH)+1;
int d=c.get(c.DATE);
System.out.println(y+"-"+m+"-"+d);
}
}
5. 仿照上题,输出当前时间。(HOUR,MINUTE,SECOND)。