第二章 Java基础应用
2.1基本语法
实例019 输出错误信息和调试信息
利用两个System类成员变量输出,两个类成员变量是out和err,都是static,out主要用于输出调试信息,err用于输出错误信息,一般用红色显示(在eclipse控制台是这样)。out和err都是实例对象成员。注:实例变量也是变量,首字母小写
1 package chapter2; 2 3 public class Demo019 { 4 public static void main(String[] args){ 5 System.out.println("输出错误信息"); 6 System.err.println("输出错误信息"); 7 8 } 9 }
输出结果:
输出错误信息
输出错误信息
备注:err可以输出错误信息,但也不仅仅只是输出错误信息,输出信息是一个基本功能,只是颜色弄成红色以示提醒,本质是输出信息,加上红色表示提醒,这些信息可以是错误的,也可以是特别需要提醒用户的。
实例020 从控制台输入字符
类似输出,输入使用in这个实例变量,也是System类的。它是一个输入流类变量,可以接收用户输入的信息,是标准的输入流实例对象。输入流就像一个管子一样,将从一个输入口接收到的东西"搭"到另一个目的地方,将信息流输入进去。System类的in就是这样的一个管子。可以从用户那里接收信息。
另外使用Scanner来扫描用户输入的信息。
代码如下:
1 package chapter2; 2 3 import java.util.Scanner; 4 5 public class Demo020 { 6 public static void main(String[] args){ 7 //搭建一个输入流扫描器 8 Scanner scanner = new Scanner(System.in); 9 //提示请输入你的名字 10 System.out.println("请输入你的名字:"); 11 //将扫描的内容输入到一个字符串中 12 String line = scanner.nextLine(); 13 //输出名字 14 System.out.println("你的名字是:" + line); 15 } 16 } 17 输出结果: 18 请输入你的名字: 19 王家玮 20 你的名字是:王家玮
实例021 暂时不懂
实例022 自动类型和强制类型转换
注意:+两边的操作数类型不同,操作值结果也是不同的。同属于基本类型的,运算后,结果是自动转换后,如果一个是字符串一个是数值,操作结果是字符串。
1 package chapter2; 2 3 public class Demo022 { 4 public static void main(String[] args){ 5 //创建各种基本类型的变量 6 byte b = 127; 7 char c = 'a'; 8 short s = 97; 9 int i = 212; 10 long l = 23242L; 11 float f = 3.4F; 12 double d = 23.4; 13 //自动转换输出 14 System.out.println("byte + char = " + (b + c));//b和c先转换成int再计算的 15 System.out.println("byte + char + short = " + (b + c + s));//同上 16 System.out.println("byte + char + short + int = " + (b + c + s + i)); 17 System.out.println("byte + char + short + int + long = " + (b + c + s + i + l)); 18 System.out.println("byte + char + short + int + long + float = " 19 + (b + c + s + i + l + f)); 20 System.out.println("byte + char + short + int + long + float + double = " 21 + (b + c + s + i + l + f + d)); 22 //强制转换 23 System.out.println("double转换成int = " + (int)d); 24 System.out.println("long转换成int = " + (int)l); 25 System.out.println("short转换成char = " + (char)s); 26 System.out.println("char转换成int = " + (int)c); 27 } 28 }
实例023 利用位运算进行加密
可以利用异或运算符^对字符串的每一个字符进行异或运算,这样就可以得到一个新的字符串,这个被处理过的字符串其实就是经过加密的。
1 package chapter2; 2 3 import java.util.*; 4 5 public class Demo023 { 6 public static void main(String[] args){ 7 //创建扫描器,扫描输入的密码 8 Scanner scanner = new Scanner(System.in); 9 System.out.println("请输入你的密码:"); 10 String str = scanner.nextLine(); 11 //将输入的字符串转换成数组进行处理 12 char[] array = str.toCharArray(); 13 for(int i = 0;i < array.length;i++){ 14 array[i] = (char) ((array[i])^100000); 15 } 16 //输出转换后的结果 17 System.out.println("加密后的结果是:"); 18 for (char i:array){ 19 System.out.print(i); 20 } 21 //另一种输出方式 22 System.out.println("\n" + new String(array)); 23 } 24 }
输出结果:
请输入你的密码:
123456
加密后的结果是:
蚑蚒蚓蚔蚕蚖
蚑蚒蚓蚔蚕蚖
总结:
灵活运用位运算可以实现很多高级、高效的算法。例如,一个数字的位移运算,每左移n位就等于这个数乘以2的n次方,每右移n位就等于这个数除以2的n次方,而且这个算法非常快。
实例024 用三元运算符判断技术和偶数
三元运算符是if...else条件语句的简写格式,可以完成简单的条件判断。本实例利用三元运算符实现奇偶数的判断,程序要求用户输入一个整数,然后判断是奇数还是偶数并输出判断结果。代码如下:
1 package chapter2; 2 /**本实例利用三元运算符实现奇偶数的判断,程序要求用户输入一个整数, 3 * 然后判断是奇数还是偶数并输出判断结果。 4 */ 5 import java.util.*; 6 7 public class Demo024 { 8 public static void main(String[] args){ 9 Scanner scanner = new Scanner(System.in); 10 System.out.println("请你输入一个整数呢:"); 11 long number = scanner.nextLong(); 12 String result = ((number%2)==0) ? "这个数是偶数!" : "这个数是奇数!"; 13 System.out.println(result); 14 15 } 16 }
总结:
三元运算符的使用语法是 (表达式判断逻辑值) ?(结果1) :(结果2) 具体的含义是:如果表达式判断的逻辑值是真,就输出结果1,如果是假就输出结果2
025 更精确的使用浮点数
使用BigDecimal进行大数运算
BigDecimal可以进行高精度的数值运算,有四个常用的四则运算方法,add,subtract,multiply,divide
package chapter2; import java.math.BigDecimal; public class Demo025 { public static void main(String[] args){ //非精确计算 double price = 3.3; double money = 5; double result = money - price; //输出剩余的钱 System.out.println("double精度剩余的钱:" + result); BigDecimal price1 = new BigDecimal(3.3); BigDecimal money1 = new BigDecimal(5); BigDecimal result1 = money1.subtract(price1); //输出精确计算下的钱 System.out.println("BigDecimal精度剩余的钱:" + result1); } } 输出结果 double精度剩余的钱:1.7000000000000002 BigDecimal精度剩余的钱:1.70000000000000017763568394002504646778106689453125
实例026 利用移位运算符进行乘法运算
程序开发中乘法运算通常是*或BigDecimal类的multiply()方法,本例用的是移位运算符实现特殊的乘法运算,这种运算方式速度效率非常之高,在大数运算的时候特别有用。
原理:一个整数A执行向左移位运算n位,效果等同于这个整数A乘以2的n次方,注意不是这个整数的n次方。
package chapter2; import java.util.*; //利用移位运算符实现整数乘法运算 public class Demo026 { public static void main(String[] args){ System.out.println("请输入一个整数:"); Scanner scanner = new Scanner(System.in); long lg = scanner.nextLong(); System.out.println("您输入的数是:" + lg); //移位运算不能单独作为一个语句 //2<<2; System.out.println("该数字乘以2的结果是:" + (lg<<1)); System.out.println("该数字乘以4的结果是:" + (lg<<2)); System.out.println("该数字乘以8的结果是:" + (lg<<3)); System.out.println("该数字乘以16的结果是:" + (lg<<4)); System.out.println("该数字乘以32的结果是:" + (lg<<5)); System.out.println("该数字乘以64的结果是:" + (lg<<6)); } } 输出结果: 请输入一个整数: 99 您输入的数是:99 该数字乘以2的结果是:198 该数字乘以4的结果是:396 该数字乘以8的结果是:792 该数字乘以16的结果是:1584 该数字乘以32的结果是:3168 该数字乘以64的结果是:6336
实例27 不借用第三个变量实现两个数字的交换
实现原理:利用按位运算的异或运算符^实现两个变量的互换。按位异或运算符进行位运算规则是:两个位,相同的结果取0,不同的结果取1.另外需要注意的是按位运算符运算结果必须赋值给一个结果,单纯的运算作为一个语句如A^B是非法的,会报错
package chapter2; import java.util.Scanner; public class Demo027 { public static void main(String[] args){ System.out.println("请输入第一个整数:"); Scanner scannera = new Scanner(System.in); long a = scannera.nextLong(); System.out.println("您输入的数是:" + a); System.out.println("请输入第二个整数:"); Scanner scannerb = new Scanner(System.in); long b = scannerb.nextLong(); System.out.println("您输入的数是:" + b); System.out.println("交换前的a和b:" + "a = " + a + " b = " + b); a = a^b; b = b^a; a = a^b; System.out.println("交换后的a和b:" + "a = " + a + " b = " + b); } }
输出结果是:
请输入第一个整数:
2
您输入的数是:2
请输入第二个整数:
9
您输入的数是:9
交换前的a和b:a = 2 b = 9
交换后的a和b:a = 9 b = 2
2.3 条件语句
实例028 判断某一年是否为闰年
原理:判断是否是闰年的关键是公式。满足两种条件的整数:1.能够被400整除的整数。2.能够被4整除但不能被100整除的整数
package chapter2; import java.util.Scanner; public class Demo028 { public static void main(String[] args){ System.out.println("请输入一个年份:"); Scanner scanner = new Scanner(System.in); long lg = scanner.nextLong(); if(((lg%4 ==0)&&((lg%100) != 0))||(lg%400 == 0)){ System.out.println("您输入的年份" + lg + "是闰年"); }else{ System.out.println("您输入的年份" + lg + "不是闰年"); } } } 输出结果: 请输入一个年份: 2100 您输入的年份2100不是闰年
注意:三元运算符(? :)是if...else...语句的简洁写法,可以根据需要来决定使用哪一种,前者常用于赋值判断,后者常用于业务流程
实例029 验证登陆信息的合法性
package chapter2; import java.util.Scanner; public class Demo029 { public static void main(String[] args){ System.out.println("请输入您的姓名:"); Scanner scannerName = new Scanner(System.in); String name = scannerName.nextLine(); System.out.println("请输入您的密码:" ); Scanner scannerPasswd = new Scanner(System.in); String password = scannerPasswd.nextLine(); loginCheck(name,password); } public static void loginCheck(String name,String password){ if(name.equals("ren") && password.equals("123456")){ System.out.println("登录成功!"); }else{ System.out.println("登录失败!"); } } }
相关说明:字符串属于基本对象而非基本数据类型,不能使用==来判断两个字符串是否相等,所以它需要通过equals()方法来判断两个字符串内容是否相同,如果使用==判断的将是两个字符串对象的地址,而非字符串内容。
实例030 为新员工分配部门
原理:这里使用switch语句,并利用hashCode来区分不同情况
import java.util.Scanner; public class Example { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入新员工的姓名:"); String name = scan.nextLine();// 接收员工名称 System.out.println("请输入新员工应聘的编程语言:"); String language = scan.nextLine();// 接收员工应聘的编程语言 // 根据编程语言确定员工分配的部门 switch (language.hashCode()) { case 3254818:// java的哈希码 case 2301506:// Java的哈希码 case 2269730:// JAVA的哈希码 System.out.println("员工"+name+"被分配到Java程序开发部门。"); break; case 3104:// c#的哈希码 case 2112:// C#的哈希码 System.out.println("员工"+name+"被分配到C#项目维护组。"); break; case -709190099: // asp.net的哈希码 case 955463181: // Asp.net的哈希码 case 9745901: // ASP.NET的哈希码 System.out.println("员工"+name+"被分配到Asp.net程序测试部门。"); break; default: System.out.println("本公司不需要" + language + "语言的程序开发人员。"); } } }
输出结果:
请输入新员工的姓名:
Jack
请输入新员工应聘的编程语言:
java
员工Jack被分配到Java程序开发部门。
实例031::用Switch语句根据消费金额计算折扣
package chapter2; import java.util.Scanner; public class ProductPrice { public static void main(String[] args) { //确定输入金额 Scanner s = new Scanner(System.in); System.out.println("请输入金额:"); float money = s.nextFloat(); //确定该打几折 float rebate = 0f; //200元以上才能打折 if(money > 200){ //定义打折等级 int grade = (int)money/200; switch(grade){ case 1:{ rebate = 0.95f; break; } case 2:{ rebate = 0.9f; break; } case 3:{ rebate = 0.85f; break; } case 4:{ rebate = 0.8f; break; } case 5:{ rebate = 0.75f; break; } case 6:{ rebate = 0.7f; break; } case 7:{ rebate = 0.65f; break; } case 8:{ rebate = 0.6f; break; } case 9:{ rebate = 0.55f; break; } default:{ rebate = 0.5f; break; } }; System.out.println("您的累积消费金额是:" + money); System.out.println("您获得的优惠折扣是:" + rebate); }else{ System.out.println("您没有折扣优惠"); } } }
注意:switch后面没有冒号,case后面有冒号,case的子句在switch后面。
实例032:判断用户输入月份的季节
package chapter2; import java.util.*; public class JudgeMonth { public static void main(String[] args) { //让用户输入月份 System.out.println("请输入月份:"); Scanner s = new Scanner(System.in); Short month = s.nextShort(); //判断月份属于哪个季度 switch(month){ case 12: case 1: case 2:{ System.out.println("您输入的月份属于冬季!"); break; } case 3: case 4: case 5:{ System.out.println("您输入的月份属于春季!"); break; } case 6: case 7: case 8:{ System.out.println("您输入的月份属于夏季!"); break; } case 9: case 10: case 11:{ System.out.println("您输入的月份属于秋季!"); break; } default:{ System.out.println("您输入的月份不存在!"); break; } } } }
上面的switch融合了多个条件,case的不同的情况也可以做相同的处理。
实例33:使用while和自增运算符进行遍历
package chapter2; public class Demo0111 { public static void main(String[] args) { //创建包含几种语言的数组 String[] language = new String[]{"Chinese", "English", "Deutsch", "Castellano"}; int index = 0; while(index < language.length){ System.out.println(language[index++]); } } } 输出结果: Chinese English Deutsch Castellano