第二章 Java 语法基础 实验目的 (1) 常量 变量与数据类型 a. 掌握 Java 的常量 变量声明及使用方法 b. 掌握 Java 各种数据类型的使用 c. 掌握基本的输入输出函数 (2) 运算符与表达式 a. 掌握算术运算 关系运算 逻辑运算, 及优先关系 b. 了解位移运算的使用方法 c. 掌握表达式的使用 (3) 常用系统类 a. 基本输入输出类的使用 b. 掌握 Math 类的使用 c. 了解时间类 Date 和 Calendar 的使用 实验范例 1 数据类型范例 public class DataTypeDemo { public static void main(string args[]) { byte b = 0x55; short s = 0x55ff; int i = 1000000; long l = 0xffffL; char c = 'a'; float f = 0.23F; // 此行 0.23 后的 F 可否去掉, 为什么? double d = 0.7E-3; boolean B = true; String S = " 这是字符串类数据类型 "; // 可否将 0.7E-3 变换为另一种等值方式来表示 System.out.println(" 字节型变量 b = " + b); System.out.println(" 短整型变量 s = " + s); System.out.println(" 整型变量 i = " + i); System.out.println(" 长整型变量 l = " + l); System.out.println(" 字符型变量 c = " + c); System.out.println(" 单精度变量 f = " + f); System.out.println(" 双精度变量 d = " + d); System.out.println(" 布尔型变量 B = " + B); System.out.println(" 字符串类对象 S = " + S);
2 运算符与表达式 (1) 数值运算范例 public class NumCalcDemo { public static void main(string args[]) { int a = 8, b = 5; // 除法运算 System.out.println( a+"/"+ b +" = " + a/b); System.out.println( a+"/"+(-b)+" = " + a/-b); System.out.println(-a+"/"+ b +" = " + -a/b); System.out.println(-a+"/"+(-b)+" = " + -a/-b); // 取模运算 System.out.println(a +"%"+ b +" = " + a%b); System.out.println(a +"%"+(-b)+" = " + a%-b); System.out.println(-a+"%"+ b +" = " + -a%b); System.out.println(-a+"%"+(-b)+" = " + -a%-b); // 自加运算 System.out.println(++a + "+" + b + "=" ++ +a + b); 会出现什么错误提示, 请修正 System.out.println(++a + "+" + b + "=" +(++a) + b); // 此行 System.out.println(a++ + "+(" + (-b) + ")=" + +(++a) + b); // 为使得输出的表达式正确, 此处应该怎么改 System.out.println(- ++a + "+" + b + "=" + - ++a + b); System.out.println(- a++ + "+" + (-b) + "=" + -a++ + -b); (2) 移位运算范例 提示 : 输出二进制函数 Integer.toBinaryString() public class BitShiftDemo { public static void main(string args[]) { int a = -16, b = 16; System.out.println("a 的二进制为 :" + Integer.toBinaryString(a)); System.out.println("a<<1:" + Integer.toBinaryString(a<<1)); // 左移 1 位 System.out.println("a>>2:" + Integer.toBinaryString(a>>2)); // 右移 2 位 ( 带符号 ) System.out.println("a>>>2:" + Integer.toBinaryString(a>>>2)); // 右移 2 位 ( 无符号 ) System.out.println("b 的二进制为 :"+Integer.toBinaryString(b)); System.out.println("b<<1:" + Integer.toBinaryString(b<<1)); // 左移 1 位 System.out.println("b>>2:" + Integer.toBinaryString(b>>2)); // 右移 2 位 ( 带符号 )
System.out.println("b>>>2:" + Integer.toBinaryString(b>>>2)); // 右移 2 位 ( 无符号 ) (3) 关系运算与逻辑运算范例 public class OperationDemo { public static void main(string args[]) { int a = 25, b = 3; boolean d = a<b; System.out.println(a+"<"+b+" = "+d); int e = 3; d = (e!=0 && a/e>5); System.out.println(e+"!=0&&"+a+"/"+e+">5 = "+d); int f = 0; d = (f!=0 && a/f>5); System.out.println("d=" + d); d = (a/f>5 && f!=0); // 有错, 如何修正? System.out.println("d=" + d); 预备知识 1 控制台输出 Java 从控制台输出可使用以下方法 : System.out.print() System.out.println() 2 控制台输入 Java 从控制台输入的 3 种方式 : (1) 用 System.in.read() 获取 " 单个 " 字符 import java.io.*; // 导入 Input/Output 数据包 public class CharInputDemo { public static void main(string [] args) throws IOException// 抛出 IO 异常 { System.out.print("Enter a Char:"); char i = (char) System.in.read(); System.out.println("your char is :"+i); (2) 用 BufferedReader 类和 InputStreamReader 类获取 " 字符串 " import java.io.*;
public class StreamReaderDemo { public static void main(string [] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = null; System.out.println("Enter your value:"); str = br.readline(); System.out.println("your value is :"+str); (3) 使用 Scanner 类读入 " 字符串 " import java.util.*; // 导入 java.util 工具包 public class ScannerDemo { public static void main(string [] args) { Scanner sc = new Scanner(System.in); System.out.println(" 请输入你的姓名 :"); String name = sc.nextline(); System.out.println(" 请输入你的年龄 :"); int age = sc.nextint(); System.out.println(" 请输入你的工资 :"); float salary = sc.nextfloat(); System.out.println(" 你的信息如下 :"); System.out.println(" 姓名 :"+name+"\n"+" 年龄 :"+age+"\n"+" 工资 : "+salary); sc.close(); // 关闭输入流 注 :(1) (2) 需要抛出异常 :throws IOException (3) 比较灵活, 建议使用 3 常用系统类: java.lang 包 : String 类 Math 类 ( 使用方法请参考教材 Java 常用系统类 ),String 类使用实例在下一章介绍 Math 类常用方法 :abs exp floor log pow random round sin\cos\tan(asin\acos\atan) 例 : public class Prog1 { public static void main(string[] args) { double a = 1.5, b = 4, c = -3; System.out.println("floor=" + Math.floor(a)); // 求最大的整数, 但不大于本身 System.out.println("ceil=" + Math.ceil(a)); // 求最小的整数, 但不小于本身
System.out.println("round=" + Math.round(a)); // 四舍五入 System.out.println("sqrt=" + Math.sqrt(b)); // 平方根 System.out.println("abs=" + Math.abs(c)); // 绝对值 System.out.println("max=" + Math.max(a, b)); // 最大值 System.out.println("random=" + Math.random()); // 随机函数 System.out.println("exp=" + Math.exp(2)); // e 为底的指数函数 System.out.println("atan=" + Math.atan(1)); // 反正切函数 4 常用系统类:JAVA 的时间类 ( 注 : 1 如果只想作简单时间计算, 搞清楚 : 例 1 和例 4 即可 2 如果想了解 JAVA 语言对时间类的整体表示方式 及处理方式, 请全看 ) ( 一 ) JAVA 时间类相关的概念 1) java 中的时间类有 :Date 和 Calendar 2) java 中时间类的本质 long( 毫秒数 ) Date = long + 历法算法 ( 方法 geryear()) Calendar = long + 历法算法 ( 方法 ger()) 3) 时间的标准有两种 (1970)GMT long (0)UTC long 4) java 中基本的时间表示 GMT long 5) java 提供了 Date 类型表示时间和日期 Date 是 long 类型的包装 6) Calendar 是历法的抽象历法 : 公历, 农历, 太阳历 7) GregorianCalendar 是历法的实现, 采用公历的算法实现的 Calendar cal = Calendar.getInstance(); Calendar cal = new GregorianCalendar();// 除了日本和泰国, 效果等同于上一句 8) Date 和 Calendar 的默认值就是系统当前时间 ( 二 ) JAVA 中有关时间的计算一 java 中表示时间的方式 1) 格林威治时间 (GMT):1970 年 1 月 1 日 00:00:00( 注 : 中国是东八区, 所以要 +8 个小时 ) 也就是 1970 年 1 月 1 日 08:00:00 2 ) 公元元年 (UTC): 0 年 3 ) 目前 java 中 3 种日期表达方式 long, Date, Calendar 都在用 例 1:JAVA 中时间的表示 import java.util.calendar;
import java.util.date; import java.util.gregoriancalendar; public class LongDateDemo { public static void main(string[] args) { long now = System.currentTimeMillis(); long year = now / 1000 / 60 / 60 / 24 / 365 + 1970; System.out.println(year); // 一年地球绕太阳一圈 (365 天 +1/4 天 ) // 原点 ( 公元元年 ) /* * date.getyear() 是将 date 内部的 long 时间, 根据历法计算为年份, 返回值是 2 位数年份, 如 :1997 年返回 97, 但是过了 * 2K 年, 返回 3 位数年份, 如 2012 返回 112 */ // 老板本 Date date = new Date();// 默认是当前时间 (long) int y = date.getyear() + 1900; int month = date.getmonth() + 1; System.out.println(y + " 年 " + month + " 月 "); // 新版本 // Calendar 历法 Calendar cal = new GregorianCalendar();// 默认是当前时间 (long) y = cal.get(calendar.year);// 2012 month = cal.get(calendar.month) + 1;// 4 System.out.println(y + " 年 " + month + " 月 "); 二 时间类型转换 long <-> Date <-> Calendar ( 注 :long 类型与 Calendar 类型相互转换必须经过 Date 类型 ) long --->Date : dat = new Date(l) dat.settime(l) Date --->Calendar : cal.settime(dat) Calendar ---> Date: cal.gettime() Date ---> long :dat.gettime() 注 :Date dat, long l, Calendar cal 例 2: 时间类型转换 import java.util.calendar; import java.util.date; import java.util.gregoriancalendar; public class DateCaseDemo { public static void main(string[] args) { long gmt = 0;// 格林威治时间 1970/01/01
Date date = new Date(); date.settime(gmt);// 回到 1970 元旦, 相当于 long -->Date System.out.println(date.getYear() + 1900);// 1970 Calendar cal = new GregorianCalendar(); // date --> cal cal.settime(date);// 将 cal 设置为 date 的时间, 也是 1970 System.out.println(cal.get(Calendar.YEAR));// 1970 // date 和 cal,gmt 代表同一时刻 // 加 -1 天, 是在当前时间上加 -1 天, 就是减少 1 天, 就是减少 1 天的毫秒数 (1000*60*60*24) cal.add(calendar.day_of_year, -1); Date d = cal.gettime(); System.out.println(d);// 1969 long l = d.gettime(); System.out.println(l);// -86400000, 因为是在原点以前的时间 三 时间的输入与输出 1) 日期输出的本质是将 Date 转换为格式化的 String 2) 日期输入的本质是将格式化的 String 转换为 Date 3) SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 构建 SimpleDateFormat 一般提供日期的格式 "yyyy-mm-dd" 具体参看 javadoc 如 :"yyyy-mm-dd HH:mm:ss" "yyyymmdd" "dd/mm/yy" "MM/dd/yyyy" 常用方法 fmt.parse(string) 可以实现将 ( 合法 ) 字符串解析为日期类型, 经常用于处理日期输入 fmt.format(date) 可以把日期格式化为字符串用于输出处理使用字符串 String 输出时间 Date ---> String: DateFormat fmt = new SimpleDateFormat("HH:mm:ss"); fmt.format(date) 把字符串 String 时间转为 Date 时间 ( 个是必须相同 ) String --> Date : DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); fmt.parse("1999-2-2") 注 :java 没有提供 String 直接转换为 Calendar 的 API 方法, 但第三方提供的 API 有这种方法如果 Calendar 需要转为 String, 必须先转换为 Date Calendar ----> Date : Date dat = cal.gettime(); 例 3: 时间的格式化输入 / 输出
import java.text.parseexception; import java.text.simpledateformat; import java.util.date; public class DateIODemo { public static void main(string[] args) throws ParseException { Date date = new Date();// 当前时间, 当前毫秒数 // 输出 yyyy-mm-dd HH:mm:ss SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 将日期类型格式化为时间字符串 String str = fmt.format(date);// 日期格式化 System.out.println(str);// 当前日期 // 解析日期字符串为日期类型对象 String day = "2015-2-10"; SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); Date d = f.parse(day);// 将日期字符串解析为 Date 类对象 long l = d.gettime();// 将 Date 类对象解析为长整型值 System.out.println(fmt.format(d)); // 2015-2-10 String s = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); System.out.println(s);// 当前日期 四 时间的计算时间计算的问题 : 1) 本质是时间毫秒数的计算 2) 简单时间计算, 直接计算毫秒数, 如 :3 天以后,2 小时等 3) 复杂时间计算, 利用 Calender 类提供的历法算法实现常用方法 : add() set() Calendar 提供的方法本是上也是计算毫秒数 例 4: 时间的计算问题 import java.text.simpledateformat; import java.util.calendar; import java.util.date; import java.util.gregoriancalendar; public class DateCalDemo { public static void main(string[] args) { // 简单时间计算 long l = System.currentTimeMillis();// 当前时间 l += 1000L * 60 * 60 * 24 * 3;// 3 天以后 SimpleDateFormat sdm = new SimpleDateFormat("yyyy-MM-dd"); String s = sdm.format(new Date(l)); System.out.println(s);
// 复杂时间计算 Calendar cal = new GregorianCalendar(); cal.add(calendar.year, 2);// 2 年以后 cal.set(calendar.month, Calendar.JANUARY);// 设置月份为 1 月 System.out.println(sdm.format(cal.getTime()));// 2 年以后的 1 月 练习题目 2-1. 判断输入的正整数是否既是 5 又是 7 的整倍数 若是, 则输出 yes; 否则输出 no 2-2. 对键盘输入的任意一个四位正整数, 计算各位数字平方和 如 :2345, 则 : 计算 2^2+3^2+4^2+5^2 2-3. 输入一个学习成绩 (0-100 之间的整数 ), 利用条件运算符的嵌套将成绩转换为等级题 : 学习成绩 > =90 分用 A 表示,60-89 分之间用 B 表示,60 分以下用 C 表示 *2-4. 在 main 函数中输入字符串, 计算这个字符串的长度 ( 字符数 ), 并输出其长度 ( 提示 : 用 s.length() 方法直接输出 ) *2-5. 在 main 函数中输入两个字符串, 将两个字符串连接起来并输出 ( 提示 : 用 s.concat() 方法直接输出 ; 也可以试一下 + 运算 ) 2-6. 显示网格 在屏幕上显示如下网格 ( 直接输出 ) +---+---+ +---+---+ 2-7. 求平方根 输入 1 个实数 x, 计算并输出其平方根 例 : 输入 1.21 输出 The square root of 1.21 is 1.1 ( 提示 : 用 Math.sqrt() 方法输出 ) 2-8. 计算旅途时间 输入 2 个整数 time1 和 time2, 表示火车的出发时间和到达时间, 计算并输出旅途时间 有效的时间范围是 0000 到 2359, 不需要考虑出发时间晚于到达时间的情况 例 : 括号内是说明输入 712 1411( 出发时间是 7:12, 到达时间是 14:11) 输出 The train journey time is 6 hrs 59 mins. 2-9. 数字加密 输入 1 个四位数, 将其加密后输出 方法是将该数每一位上的数字加 9, 然后除以 10 取余, 做为该位上的新数字, 最后将第 1 位和第 3 位上的数字互换, 第 2 位和第 4 位上的数字互换, 组成加密后的新数
例 : 括号内是说明输入 1257 输出 The encrypted number is 4601( 每一位上的数字加 9 除以 10 取余后, 得 0146, 交换后得到 4601) 2-10. 大小写字母转换 输入一个大写英文字母, 输出相应的小写字母 例 : 输入 G 输出 g ( 提示 : 用 System.in.read() 函数读入, 请参考 [ 预备知识 ]-> 控制台输入第 1 种方式 ) 2-11. 计算存款利息 输入存款金额 money 存期 year 和年利率 rate, 根据下列公式计算存款到期时的利息 interest( 税前 ), 输出时保留 2 位小数 interest = money(1+rate)^year - money 输入输出示例 : 括号内为说明输入 1000 3 0.025 (money = 1000, year = 3, rate = 0.025) 输出 interest = 76.89 2-12. 华氏温度转换成摄氏温度 转换公式 :c = 5/9(f-32). 2-13. 有 5 个人坐在一起, 问第五个人多少岁? 他说比第 4 个人大 2 岁 问第 4 个人岁数, 他说比第 3 个人大 2 岁 问第三个人, 又说比第 2 人大两岁 问第 2 个人, 说比第一个人大 两岁 最后问第一个人, 他说是 10 岁 请问第五个人多大? 2-14. 读取系统当前日期时间的长整型值, 计算对应的年份并输出 ; 利用 Date 类获取系统当 前日期时间, 计算对应的年份, 以 yy-mm-dd 格式输出日期 ; 利用 Calendar 类获取系统当 前日期时间, 计算对应的年份, 以 yyyy-mm-dd 格式输出日期 2-15. 计算当前据最近的五月一号还有多少天