第 3 章 Java 语言基础 第 1/55 页
习题 3 3. 8. 9. 13. 18. 实验 : 1. 实验 4( 实 P11~12) 2. 实验任务 : 1 例 3.1( 教 P30) 2 变量赋值 ( 教 P29) 3 编写两个缓冲区对应同一个输入流对象, 并键盘输入整型 a 和双精度 b, 求和 第 2/55 页
习题 3 3. 实验任务 : 1 实验 5( 实 P12~13) 2 实验 8( 实 P16~17) 3 实验 9( 实 P17~19) 4 设 x=5,y=-3,z=6, 试输出公式的值 : e z ( x 2 7 y 2 + 4 z e ) xz πz 3 x 2 y (15 x + z ) 式中,e 自然数,π 圆周率 第 3/55 页
z 习题 3 4. 实验任务 : = p 1 实验 7( 实 P15) 2 设 x=10,y=25,z=83, 试输出优化后公式的值 : z + 10 x = x z 1 = z + 3 将下多个公式合并成一个算式, 优化算式, 并输出 ( 变量值自行给出 ) p =, =, = +, i = i + 1 p m m i s x y = s = z = x * ( z m 1) 第 4/55 页
本章主要内容 数据类型 变量 基本类型变量 数据类型的转换规则 从键盘输入数据的语句格式 运算符 第 5/55 页
3.1 数据类型 数据类型的基本要素 数据的性质 ( 数据结构 ) 数据的取值范围 ( 字节大小 ) 数据的存储方式 参与的运算变量的属性 名字 类型 值 地址 第 6/55 页
3.1 数据类型 基本数据类型由程序设计语言系统所定义 不可再划分的数据类型 所占内存大小是固定的, 与软硬件环境无关 在内存中存放的是数据值本身 整型 : byte short int long 浮点型 : float double 逻辑型 : boolean 字符型 :char 引用数据类型 ( 复合数据类型 ) 在内存中存放的是指向该数据的地址, 不是数据值本身 类 数组 接口等 第 7/55 页
3.1 数据类型 整型 类型数据位范围 byte( 字节型 ) 8-128~127, 即 -2 7 ~2 7-1 short( 短整型 ) 16-32768~32767, 即 -2 15 ~2 15-1 int( 整型 )( 默认 ) 32-2 147 483 648~2 147 483 647, 即 -2 31 ~2 31-1 long( 长整型 )(l 或 L) 64-9 223 372 036 854 775 808~9 223 372 036 854 775 807, 即 -2 63 ~2 63 -l byte: 7 6 1 0 0 1 short: 15 14 13 9 8 7 6 2 1 0 0 1 第 8/55 页
浮点型标准计数法和科学计数法 类型数据位范围 float( 单精度浮点 )(f 或 F) 32 1.4E-45~3.4E+38 double( 双精度浮点 )( 默认 ) 64 4.9E-324~1.8E+308 float: 31 30 0 1 数据符号位 小数点 25 24 23 22 17 16 15 14 基数位 24bit 9 8 7 6 1 0 0 1 指数符号位 指数位 6bit 第 9/55 页
逻辑型 (boolean 布尔型 ) 只有 true( 真 ) 和 false( 假 ) 两个取值 true 和 false 不能转换成数字表示形式 占 1 个字节, 默认 false 第 10/55 页
boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined. boolean: 布尔数据类型只有两个可能的值 :true 和 false 对于简单的标记来跟踪真 / 假条件使用此数据类型 这种数据类型代表一个比特的信息, 但它的 大小 没有明确界定 ( 与 JVM 有关, 可能是字节, 也可能字符 ) 第 11/55 页
3.1 数据类型 逻辑型的可能存储结构 boolean: 字节寻址 7 6 1 0 0 1 0 1 0 1 位寻址 0 1 字寻址 15 14 0 1 0 1 9 8 7 6 1 0 0 1 0 1 0 1 0 1 0 1 0 1 位寻址 第 12/55 页
JVM 规范第 2 版 : Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java virtual machine int data type. Where Java programming language boolean values are mapped by compilers to values of Java virtual machine type int, the compilers must use the same encoding. 而 :Java virtual machine type int, whose values are 32-bit signed two'scomplement integers Arrays of type boolean are accessed and modified using the byte array instructions In Sun's JDK releases 1.0 and 1.1, and the Java 2 SDK, Standard Edition, v1.2, boolean arrays in the Java programming language are encoded as Java virtual machine byte arrays, using 8 bits per boolean element. 第 13/55 页
3.1 数据类型 逻辑型的可能存储结构 数据存储 : 31 30 25 24 23 22 17 16 15 14 9 8 7 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 数组存储 : [0] [1] 7 6 1 0 0 0 0 0 1 0 0 0 0 1 [n-1] 0 0 0 0 1 第 14/55 页
字符型 (char) 用来存储单个字符 采用的是 Unicode 字符集编码方案, 在内存中占 2 个字节 字符声明只能表示单个字符, 用单引号 Java 语言中所有可见的 ASCII 字符都可以用单引号括起来成为字符 字符型数据可以转化为整型 第 15/55 页
3.1 数据类型 编码方式 :ASCII 码 ( 字符 ) GB2312 国标编码 ( 汉字 ) Unicode 新的国际标准编码 ( 中英文 ) Unicode 字符采用 \u0000 ----\uffff 之间的十六进制表示 Unicode 字符表的前 128 个刚好是 ASCII 表 第 16/55 页
第 17 55页
第 18 55页
3.2 关键字与标识符 访问控制 private protected public 关类, 方法 abstract implements extends final class 教和变量修 interface native new static strictfp 材表饰符 synchronized transient volatile break continue case default do 3 程序控制 else for if instanceof return switch while 5 (错误处理 try catch throw throws finally 都包相关 import package 是boolean byte char double false 小基本类型 float int long null short 写true )变量引用 super this void 保留字 goto const enum. 键字( 保留字)见第 19/55 页
第 20/55 页
标识符用来表示变量名 类名 方法名 数组名和文件名的有效字符序列 规定 : 可以由字母 数字 下划线 ( _ ) 美元符号 ($) 组合而成 必须以字母 下划线或美元符号开头, 不能以数字开头 关键字不能当标识符使用 区分大小写 编码习惯 : 类名首字母大写, 变量 方法及对象首字母小写 第 21/55 页
整型常量 ( 八进制 十六进制 十进制长整型后需要加 l 或 L) 浮点型常量 ( 单精度后加 f 或 F, 双精度后加 d 或 D 可省略 ) 逻辑型常量字符型常量单引号 ( 转义字符见教材表 3.6) \n 换行 (\u000a) \t 水平制表符 (\u0009) \b 空格 (\u0008) \r 回车 (\u000d) \f 换页 (\u000c) \' 单引号 (\u0027) \" 双引号 (\u0022) \\ 反斜杠 (\u005c) \ddd 三位八进制 \uxxxx 四位十六进制 第 22/55 页
第 23/55 页
第 24/55 页
字符串常量双引号 常量的声明 final int MAX = 10; MAX = 20; // 错误 final float PI; PI = 3.14f; PI = 3.1415f; // 错误 第 25/55 页
3.4 变量 变量声明 初始化 赋值如 :int i, j=0; i = 8; float k; k = 3.6f; Java 语言程序中可以随时定义变量, 不必集中在执行语句之前 第 26/55 页
3.5 数据类型转换 数值型不同类型数据的转换 自动类型转换 1 转换前的数据类型与转换后的类型兼容 2 转换后的数据类型的表示范围比转换前的类型大 条件 2 说明不同类型的数据进行运算时, 需先转换为同一类型, 然后进行运算 转换从 短 到 长 的优先关系为 : byte short char int long float double 第 27/55 页
3.5 数据类型转换 强制类型转换如果要将较长的数据转换成较短的数据时 ( 不安全 ), 就要进行强制类型转换 强制类型转换的格式如下 : ( 欲转换的数据类型 ) 变量名 第 28/55 页
字符串型数据与整型数据相互转换 字符串转换成数值型数据 ( 见教材表 3.7) String MyNumber = "1234.56"; float MyFloat = Float.parseFloat(MyNumber); 第 29/55 页
数值型数据转换成字符串在 Java 语言中, 字符串可用加号 + 来实现连接操作 所以若其中某个操作数不是字符串, 该操作在连接之前会自动将其转换成字符串 所以可用加号来实现自动的转换 int MyInt=1234; // 定义整形变量 MyInt String MyString=""+MyInt; // 将整型数据转换成了字符串 第 30/55 页
由键盘输入的数据, 不管是文字还是数字,Java 皆视为字符串, 因此若是要由键盘输入数字则必须再经过转换 输入字符串 第 31/55 页
import java.io.*; public class class_name { // 类名称 public static void main(string[ ] args) throws IOException { String str; InputStreamReader inp; inp=new InputStreamReader(System.in); BufferedReader buf; buf=new BufferedReader(inp); str=buf.readline( ); } } 第 32/55 页
3.6 由键盘输入数据 这种输入数据的方式可变形为如下的格式 import java.io.*; public class class_name { // 类名称 public static void main(string[ ] args) throws IOException { String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in)); str=buf.readline( ); } } 第 33/55 页
由键盘输入的数据, 不管是文字还是数字,Java 皆视为字符串, 因此若由键盘输入数字则必须再经过转换 输入字符串 第 34/55 页
// appa_3.java 由键盘输入字符串 import java.io.*; // 加载 java.io 类库里的所有类 public class App3_3 { public static void main(string[ ] args) throws IOException { BufferedReader buf; String str; buf=new BufferedReader (new InputStreamReader (System.in)); System.out.print(" 请输入字符串 ;"); str = buf.readline( ); // 将输入的文字指定给字符串变量 str 存放 System.out.println(" 您输入的字符串是 :"+str); // 输出字符串 } } 第 35/55 页
输入数值由于从键盘输入的数据均被视为字符串, 所以从键盘上输入的数据, 必须先利用表 3.7 中所提供的方法进行转换后, 字符串的内容才会变成数值 第 36/55 页
//App3_4.java 由键盘输入整数 import java.io.*; public class App3_4 { public static void main(string[ ] args) throws IOException { float num; String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in)); System.out.print(" 请输入一个实数 :"); str=buf.readline( ); // 将输入的文字指定给字符串变量 str 存放 num= Float.parseFloat(str); // 将 str 转换成 float 类型后赋给 num System.out.println(" 您输入的数为 :"+num); } } 第 37/55 页
输入多个数据 // 方法 1:App3_5.java 由键盘输入多个数据 import java.io.*; public class App3_5 { public static void main(string[ ] args) throws IOException { int num1,num2; String str1,str2; InputStreamReader in; in= new InputStreamReader(System.in); BufferedReader buf; buf=new BufferedReader(in); System.out.print(" 请输入第一个数 :"); str1=buf.readline( ); // 将输入的内容赋值给字符串变量 str1 num1=integer.parseint(str1); // 将 str1 转成 int 类型后赋给 num1 System.out.print(" 请输入第二个数 :"); str2=buf.readline( ); // 将输入的内容赋值给字符串变量 str2 num2=integer.parseint(str2); // 将 str2 转成 int 类型后赋给 num2 System.out.println(num1+"*"+num2+"="+(num1*num2)); } } 第 38/55 页
为了简化输入操作, 从 Java SE 5 版本开始在 java.util 类库中新增了一个类专门用于输入操作的类 Scanner, 可以使用该类输入一个对象 import java.util.*; public class class_name { // 类名称 public static void main(string[ ] args) { Scanner reader=new Scanner(System.in); double num; num=reader.nextdouble( ); } } 第 39/55 页
在该结构中用创建的 reader 对象调用 nextdouble( ) 方法来读取用户从键盘上输入的 double 型数据, 也可用 reader 对象调用下列方法, 读取用户在键盘上输入的相应类型的数据 : nextbyte( ) nextdouble( ) nextfloat( ) nextint( ) nextlong( ) nextshort( ) next( ) nextline( ) 第 40/55 页
输入多个数据 // 方法 2:App3_6.java 由键盘输入多个数据 import java.util.*; // 加载 java.util 类库里的所有类 public class App3_6 { public static void main(string[ ] args) { int num1; double num2; Scanner reader=new Scanner(System.in); System.out.print(" 请输入第一个数 :"); num1= reader.nextint( ); // 将输入的内容做 int 型数据赋值给变量 num1 System.out.print(" 请输入第二个数 :"); num2= reader.nextdouble( ); // 将输入的内容做 double 型数据赋值给变量 num2 System.out.println(num1+"*"+num2+"="+(num1*num2)); } } 第 41/55 页
上例中,reader 对象还可以调用 nextbyte( ) nextfloat( ) nextdouble( ) nextint( ) 等 nextx ( ) 被调用后, 则等待用户在命令行输入数据并按回车键 ( 或空格键 Tab 键 ) 确认 next( ) 和 nextline( ) 方法表示等待用户在键盘上输入一行文本, 然后返回一个 String 类型的数据 第 42/55 页
输入多个数据利用 Scanner 类, 使用 next( ) 和 nextline( ) 方法接收从键盘输入字符串型数据 //App3_7.java 由键盘输入多个数据 import java.util.*; // 加载 java.util 类库里的所有类 public class App3_7 { public static void main(string[ ] args) { String s1,s2; Scanner reader=new Scanner(System.in); System.out.print(" 请输入第一个数 :"); s1= reader.nextline( ); // 将输入的内容作为字符型数据赋值给变量 s1 System.out.print(" 请输入第二个数 :"); s2= reader.next( ); // 按 Enter 键后 next( ) 方法将回车符和换行符去掉 System.out.println(" 输入的是 "+s1+" 和 "+s2); } } 第 43/55 页
Scanner 类,next( ) 和 nextline( ) 方法区别 next( ) 和 nextxxx( ): 一定要读取到有效字符后才可以结束输入, 对输入有效字符之前遇到的空格键 Tab 键或 Enter 键等结束符, 它将自动将其去掉, 只有在输入有效字符之后, 该方法才将其后输入的这些符号视为分隔符 nextline( ): 结束符为 Enter 键, 即返回 Enter 之前的所有字符 第 44/55 页
3.7 算数运算符与表达式 按照运算符功能来分, 基本的运算符有下面几类 算术运算符 + - * / % ++ -- 关系运算符 > < >= <= ==!= 逻辑运算符! && & ^ 位运算符 >> << >>> & ^ ~ 赋值运算符 = 扩展赋值运算符, 如 += /= 等 条件运算符? : 其他运算符包括分量运算符. 下标运算符 [ ] 实例运算符 instanceof 内存分配运算符 new 强制类型转换运算符 ( 类型 ) 方法调用运算符 ( ) 等 第 45/55 页
3.7.1 算术运算符 + - * / % +( 取正 ) -( 取负 ) ++ -- 两个整数相 /, 结果为整数 对于两个整数之间的除法和取模运算, 则式子 (a/b)*b+(a%b)==a 是恒成立的 第 46/55 页
3.7.1 算术运算符 对取模运算符 % 来说, 其操作数可以为浮点数 即 a % b 与 a-((int)(a/b)*b) 的语义相同, 这表示 a % b 的结果是除完后剩下的浮点数部分 如 37.2%10=7.2 ( 默认双精度 ) 值得注意的是 Java 语言对加运算符进行了扩展, 使它能够进行字符串的连接, 如 "abc"+"de", 得到字符串 "abcde" 第 47/55 页
3.7.2 关系运算符 > < >= <= ==!= 不能在浮点数之间作 == 的比较 第 48/55 页
与 或 非 异或 同或示意图 E K1 K2 L 开关合上 :true, 灯亮 :true R 或 电路 与 电路 非 电路 true true true true 异或 电路 同或 电路 第 49/55 页
! && & ^( 异或 ) 第 50/55 页
逻辑运算和关系运算的关系非常紧密, 关系运算的结果为布尔型, 逻辑运算的操作数与运算结果都是布尔型 简洁运算 (&& ) 与非简洁运算 (& ) 的区别在于 : 非简洁运算在必须计算完左右两个表达式之后, 才取结果值 ; 而简洁运算可能只计算左边的表达式而不计算右边的表达式, 即对于 &&, 只要左边表达式为 false, 就不计算右边表达式, 则整个表达式为 false; 对于, 只要左边表达式为 true, 就不计算右边表达式, 则整个表达式为 true 第 51/55 页
位运算符 : >> << >>> & ^ ~ 第 52/55 页
赋值运算符 : = 扩展赋值运算符 (+= 等 ) 自动类型转换 右结合性 第 53/55 页
3.7.5 条件运算符和字符串运算符 条件运算符 : 表达式 1? 表达式 2 : 表达式 3 字符串运算符字符串运算符 + 是以 String 为对象进行的操作 运算符 + 完成字符串连接操作, 如果必要, 则系统自动把操作数转换为 String 型 float a = 100f; // 定义变量 a 为浮点型 System.out.println("The value of a is" + a + "\n"); // 系统自动将 a 转换成字符串 String s1 = ""; s1 += a; // s1=s1+a, 若 a 非 String 型, 自动转换为 String 型 第 54/55 页
3.7.6 表达式及运算符的优先级 结合性 第 55/55 页