(一)示例程序+运行结果:
①EnumTest.java
1 public class EnumTest { 2 3 public static void main(String[] args) { 4 Size s=Size.SMALL; 5 Size t=Size.LARGE; 6 //s和t引用同一个对象? 7 System.out.println(s==t); // 8 //是原始数据类型吗? 9 System.out.println(s.getClass().isPrimitive()); 10 //从字符串中转换 11 Size u=Size.valueOf("SMALL"); 12 System.out.println(s==u); //true 13 //列出它的所有值 14 for(Size value:Size.values()){ 15 System.out.println(value); 16 } 17 } 18 19 } 20 enum Size{SMALL,MEDIUM,LARGE};
运行结果:
②Addition.java
1 // An addition program 2 3 import javax.swing.JOptionPane; // import class JOptionPane 4 5 public class Addition { 6 public static void main( String args[] ) 7 { 8 String firstNumber, // first string entered by user 9 secondNumber; // second string entered by user 10 int number1, // first number to add 11 number2, // second number to add 12 sum; // sum of number1 and number2 13 14 // read in first number from user as a string 15 firstNumber = 16 JOptionPane.showInputDialog( "Enter first integer" ); 17 18 // read in second number from user as a string 19 secondNumber = 20 JOptionPane.showInputDialog( "Enter second integer" ); 21 22 // convert numbers from type String to type int 23 number1 = Integer.parseInt( firstNumber ); 24 number2 = Integer.parseInt( secondNumber ); 25 26 // add the numbers 27 sum = number1 + number2; 28 29 // display the results 30 JOptionPane.showMessageDialog( 31 null, "The sum is " + sum, "Results", 32 JOptionPane.PLAIN_MESSAGE ); 33 34 System.exit( 0 ); // terminate the program 35 } 36 }
运行结果:
③InputTest.java
1 import java.util.*; 2 3 public class InputTest 4 { 5 public static void main(String[] args) 6 { 7 Scanner in = new Scanner(System.in); 8 9 // get first input 10 System.out.print("What is your name? "); 11 String name = in.nextLine(); 12 13 // get second input 14 System.out.print("How old are you? "); 15 int age = in.nextInt(); 16 17 18 /* int i; 19 String value="100"; 20 i=Integer.parseInt(value); 21 i=200; 22 String s=String.valueOf(i);*/ 23 24 // display output on console 25 System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1)); 26 27 28 } 29 }
输出结果:
④TestDouble.java
1 public class TestDouble { 2 3 public static void main(String args[]) { 4 System.out.println("0.05 + 0.01 = " + (0.05 + 0.01)); 5 System.out.println("1.0 - 0.42 = " + (1.0 - 0.42)); 6 System.out.println("4.015 * 100 = " + (4.015 * 100)); 7 System.out.println("123.3 / 100 = " + (123.3 / 100)); 8 } 9 }
运行结果:
⑤
1 public class Test { 2 3 public static void main(String args[]) { 4 int X=100; 5 int Y=200; 6 System.out.println("X+Y="+X+Y); 7 System.out.println(X+Y+"=X+Y"); 8 } 9 }
运行结果:
结论:引号里输出原有的。
(二)课后练习:
1.阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。
①原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
②反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
③补码:正数的补码与其原码相同;负数的补码是符号位不变,剩下的对其原码逐位取反,最后加1。
如1的原码:0000 0001,其反码和补码都为:0000 0001。
-1的原码:1000 0001,其反码:1111 1110,补码:1111 1111.
因为正数的反码、补码都与原码相同,所以直接对复数进行操作。
原始结果:
位运算1(左移<<)
位运算2(右移>>)
位运算3(位或|)
位运算4(位与&)
位运算5(位异或^)
经查询并排除原码和反码,JAVA中的数是用补码表示的。
2.Java变量遵循“同名变量的屏蔽原则”,请课后阅读相关资料弄清楚相关知识,然后自己编写一些测试代码,就象本示例一样,有意识地在不同地方定义一些同名变量,看看输出的到底是哪个值。
①
1 public class Test2 { 2 3 private static int value=1; 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 int value=2; 8 System.out.println(value); 9 }
输出结果:2
②
1 public class Test2 { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 int value=2; 6 System.out.println(value); 7 } 8 private static int value=1; 9 }
输出结果:2
③
1 public class Test2 { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 int x=1; 6 while(x>0) 7 { 8 int value=1; 9 x--; 10 } 11 int value=2; 12 System.out.println(value); 13 } 14 }
输出结果:2
结论:如果类里面定义一个x,在这个类的函数中也定义一个x,这种情况不会冲突,默认会优先使用函数中的x,类中的x要加上this.来区分,这算是有冲突但是用默认谁优先来解决,这算是的特殊情况。
如果一个函数中(最外层)定义了x,在函数中的另外一处也定义了x,或者说在函数的某个循环中定义了x,就会引起冲突。
如果在一个函数的一个循环A中定义了x,循环B中也定义了x,只要A,B不是相互包含的,那么也不会有冲突
3.为什么double类型的数值进行运算得不到“数学上精确”的结果?(提示:这个问题,与浮点数在计算机内部的表示方法有关系。可以使用这个知识在搜索引擎中查找相关资料。)
这个涉及到二进制与十进制的转换问题。
N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×10²+2×10+3×(10的0次幂)+4×(10的-1次幂);其它进制的也是同理,例如二进制数11.01=1×2+1×(2的0次幂)+0+1×(2的-2次幂)=十进制的3.25。
double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。
举个例子来说,比如要用4bit来表示小数3.26,从高到低位依次对应2的1,0,-1,-2次幂,根据最上面的分析,应当在二进制数11.01(对应十进制的3.25)和11.10(对应十进制的3.5)之间选择。
简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
4.在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。(为什么会这样呢?)
Double,不能准确地代表16位有效数以上的数字,在使用BigDecimal时,应用 BigDecimal(String)构造器创建对象才有意义。另外,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算 符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。