课堂动手动脑
1、编写一个程序,用户输入两个数,求出其加减乘除,并用消息框显示计算结果。
源代码:
1 package tutorial; 2 import javax.swing.JOptionPane; 3 4 public class Option2 { 5 6 7 public static void main(String[] args) { 8 String firstNumber,secondNumber,result; 9 10 int number1,number2; 11 12 firstNumber = JOptionPane.showInputDialog("The first number :"); 13 14 secondNumber = JOptionPane.showInputDialog("The second number :"); 15 16 number1 = Integer.parseInt(firstNumber); 17 18 number2 = Integer.parseInt(secondNumber); 19 20 result = number1 + " + " + number2 + " = " + (number1 + number2) + "\n" + number1 + " - " + number2 + " = " + (number1 - number2) + "\n" + number1 + " * " + number2 + " = " + (number1 * number2) + "\n" + number1 + "/" + number2 + " = " + (number1 / number2); 21 22 JOptionPane.showConfirmDialog(null, result,"Results",JOptionPane.PLAIN_MESSAGE); 23 } 24 25 }
运行结果截图:
2、枚举类型练习
得到的结论:枚举不属于原始数据类型,枚举类型中每个元素都是不同的对象,在程序中不同的地方引用的该枚举类型的同一个值时是同一个对象
3、计算机中数字的编码方式
计算机中的数字是以二进制方式存储的,第一个二进制位为符号位,0代表正数,1代表负数
原码、反码、补码是计算机中存储数字使用的编码
(1)、原码、反码、补码的概念
原码:符号位加上这个数绝对值
例如正整数1的8位二进制原码为 00000001 负整数-1的8为二进制原码为 10000001
反码:正数的反码就是其本身,负数的反码就是在原码的基础上除符号位外所有的位取反
例如正整数1的8位二进制原码为 00000001 则其反码还为 00000001
负整数-1的8为二进制原码为 10000001 其反码为 11111110
补码:正数的补码是其本身,负数的补码为其反码再加1
例如正整数1的8位二进制原码为 00000001 则其补码还为 00000001
负整数-1的8为二进制原码为 10000001 其反码为 11111110 其补码为 11111110 + 00000001 = 11111111
(2)、Java语言中的数字是以补码方式存储的
验证如下:
由负整数10无符号右移一位得正2147483643可知Java中数字的存储方式为补码
分析:
如果存储方式为原码 则-10 存储的二进制表示为 10000000 00000000 00000000 00001010 无符号右移一位 得 01000000 00000000 00000000 00000101 此数十进制为 1073741829
如果存储方式为反码 则-10 存储的二进制表示为 11111111 11111111 11111111 11110101 无符号右移一位 得 01111111 11111111 11111111 11111010 此数十进制为 2147483642
如果存储方式为补码 则-10 存储的二进制表示为 11111111 11111111 11111111 11110110 无符号右移一位 得 01111111 11111111 11111111 11111011 此数十进制为 2147483643
Java中负整数10无符号右移一位得正2147483643与存储方式为补码分析出来的结果相同
所以Java中数字存储方式为补码。
4、同名变量屏蔽原则:
Java中变量遵循同名变量屏蔽原则,即如果局部定义的某个变量与全局某个变量重名时,将屏蔽全局的同名变量,引用该变量名是引用的为局部的变量
实例检验:
分析:局部变量a与全局变量a重名,当输出变量a的值时输出的为局部的变量a的值
5、Java中的类型转换:
实线为无精度损失,虚线为有精度损失
如果转换后的数据类型占的位数或其可表示的数值范围 大于 原始数据类型的位数或其可表示的数值范围 则转换过程 无 精度损失
如果转换后的数据类型占的位数或其可表示的数值范围 小于 原始数据类型的位数或其可表示的数值范围 则转换过程 有 精度损失
6、double类型存储不准确
浮点数在计算机中的存储方式:
符号位+指数位+尾数位
float:占4个字节 32位 则 存储方式为 符号位占1位(为31位) 指数位占8位(30-23位) 尾数位占23位(22-00位)
double:占8个字节 64位 则 存储方式为 符号位占1位(63位) 指数为占11位(62-52位) 尾数位占52位(51-00位)
浮点数在计算机中都以其二进制的科学计数法方式存储
例如 10.3
整数部分为10 二进制表示为 1010
小数部分0.3(小数部分取二进制,乘2取整数部分,将乘2后的结果减去取出来的整数部分再乘2,一次循环,直到将乘2后的结果减去取出来的整数部分得0,依次将取出的整数部分排列即为其二进制表示方式)
0.3 * 2 = 0.6 (整数部分0)
(0.6 - 0) * 2 = 1.2 (整数部分1)
(1.2 - 1) * 2 = 0.4 (整数部分0)
(0.4 - 0) * 2 = 0.8 (整数部分0)
(0.8 - 0) * 2 = 1.6 (整数部分1)
(1.6 - 1) * 2 = 1.2(整数部分1)开始循环
所以0.3的二进制表示方式为0.010010100101001(按照01001循环)
所以10.3的二进制表示为:1010.010010100101001......
其科学计数法表示方式为:1.010010010100101001...E100 (指数为3 二进制表示为100 所以为E100)
用float类型在计算机中存储方式为:
符号位:0表示正数,1表示负数
指数位:100 在float中指数位要加上十进制的127 即二进制的 01111111
所以指数位为 00000100 + 01111111 = 10000010 所以符号位为:10000010
尾数位:为科学计数法小数点后面的部分 0100100101001...(填满23位,如果后面不是循环的用0补全)
用double类型在计算机中存储方式为:
符号位:0表示正数,1表示负数
指数位:100 在float中指数位要加上十进制的1023 即二进制的 01111111111
所以指数位为 00000000100 + 01111111111 = 10000000010 所以符号位为:10000000010
尾数位:为科学计数法小数点后面的部分 0100100101001...(填满52位,如果后面不是循环的用0补全)
由于浮点型数据的存储方式所以会造成数据不精确
7、输出每个变量的值和变量的和
看下面的例子:
在默认情况下,编译器会把'+'当做运算符,所以第二个输出语句X+Y的输出结果为这两个变量的和300
当前面有字符串后再加'+',编译器就会把'+'当做字符串连接符,所以第一个输出语句X+Y中'+'起连接作用,所以会依次输出这两个变量的值。
8、生成随机验证码
源代码:
1 package tutorial; 2 3 public class RandStr { 4 5 public static void main(String[] args) { 6 String result = ""; 7 //循环生成6个字母 8 for(int i = 0;i < 6;i++){ 9 int val = (int)(Math.random() * 26 + 97);//随机生成一个97-122的整数 10 result += (char)val;//将此整数转换为字符并连接到字符串变量result上 11 } 12 //输出结果 13 System.out.println(result); 14 15 } 16 17 }
运行如果截图: