JAVA语法02之课程问题解决

(一)示例程序+运行结果:

①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的对象。

 

 

 

posted @ 2016-10-05 17:53  夏小暑  阅读(295)  评论(0编辑  收藏  举报