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

     

     

     

  • 相关阅读:
    Stream概念的理解
    nodejs进程间通信
    nodejs多进程spawn execFile exec fok方法的区别
    socket这个名词的理解
    Object.defineProperty方法总结
    git中HEAD^和HEAD~区别
    http常见的9种方法
    java怎么建立JAVA工程项目?
    树莓派mjpg-stream摄像头监控
    制作OS X 10.9 Mavericks 安装U盘
  • 原文地址:https://www.cnblogs.com/xiaxiaoshu/p/5931333.html
Copyright © 2020-2023  润新知