动手动脑1(00JAVA语言基础)

9.30  (00-JAVA语言基础)

1.仔细阅读示例: EnumTest.java,运行它,分析运行结果? 你能得到什么结论?你掌握了枚举类型的基本用法了吗?

结论:第一个false是判断s和t是否引用同一个对象,第二个false是判断它是否为类包的数据,第三个ture 是判断s是否等于u,最后是列出它里面的所有元素,从中得出枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象,相同的值则引用同一个对象,可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。枚举类型使用时需要用到字符串类型到枚举类型的转换。

2.阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。

①原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

②反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

③补码:正数的补码与其原码相同;负数的补码是符号位不变,剩下的对其原码逐位取反,最后加1。

如1的原码:0000 0001,其反码和补码都为:0000 0001。

-1的原码:1000 0001,其反码:1111 1110,补码:1111 1111.

因为正数的反码、补码都与原码相同,所以直接对复数进行操作。

经查询并排除原码和反码,JAVA中的数是用补码表示的。

3.源文件:Addition.java 使用两个输入框输入数据 用一个消息框显示计算结果

// An addition program 
 
 import javax.swing.JOptionPane;  // import class JOptionPane
 
 public class Addition {
    public static void main( String args[] )
    {
       String firstNumber,   // first string entered by user
              secondNumber;  // second string entered by user
       int number1,          // first number to add
           number2,          // second number to add
           sum;              // sum of number1 and number2
 
       // read in first number from user as a string
       firstNumber =
          JOptionPane.showInputDialog( "Enter first integer" );
 
       // read in second number from user as a string
       secondNumber =
          JOptionPane.showInputDialog( "Enter second integer" );
 
       // convert numbers from type String to type int
       number1 = Integer.parseInt( firstNumber ); 
       number2 = Integer.parseInt( secondNumber );
 
       // add the numbers
       sum = number1 + number2;
 
       // display the results
       JOptionPane.showMessageDialog(
          null,"The sum is "+sum,"Results",
          JOptionPane.PLAIN_MESSAGE );
 
       System.exit( 0 );   // terminate the program
    }
}

运行结果:

        

4.Java变量遵循“同名变量的屏蔽原则”,请课后阅读相关资料弄清楚相关知识,然后自己编写一些测试代码,就象本示例一样,有意识地在不同地方定义一些同名变量,看看输出的到底是哪个值。

public class test1 {
private static int value=1;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    int value=2;
    System.out.println(value);
    }
}

运行结果:2

5.看着这个图,再查查Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?

 

char 8位二进制数范围是-2的7次方到2的7次方-1,

byte 8位带符号整数-128到127之间的任意整数,

short 16位无符号整数-32768到32767之间的任意整数,

int 32位带符号整数-2的31次方到2的31次方-1之间的任意整数,

long 64位带符号整数-2的63次方到2的63次方-1之间的任意整数,

float 32位单精度浮点数,

double 64位双精度浮点数。

结论是:Java会自动完成从低级类型向高级类型转换,即取值范围相对较小的数据类型转换成取值范围相对较大的数据类型。

6.请运行以下代码(TestDouble.java),你看到了什么样的输出,意外吗?

 

 输出结果:

输出的结果跟平时double类型输出结果精度不一样。

7.为什么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,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。

8.在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。(为什么会这样呢?)

import java.math.BigDecimal;
 public class TestBigDecimal
 {
     public static void main(String[] args) 
     {
         BigDecimal f1 = new BigDecimal("0.05");
         BigDecimal f2 = BigDecimal.valueOf(0.01);
         BigDecimal f3 = new BigDecimal(0.05);
         System.out.println("下面使用String作为BigDecimal构造器参数的计算结果:");
         System.out.println("0.05 + 0.01 = " + f1.add(f2));
         System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
         System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
         System.out.println("0.05 / 0.01 = " + f1.divide(f2));
         System.out.println("下面使用double作为BigDecimal构造器参数的计算结果:");
         System.out.println("0.05 + 0.01 = " + f3.add(f2));
         System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
         System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
         System.out.println("0.05 / 0.01 = " + f3.divide(f2));
     }
 }

运算结果截图:

因为double不能准确的代表BigDecimal(String) 16位有效数以上的数字,在使用BigDecimal时,用*、/构造器创建对象。BigDecimal所创建的对象不能使用传统的等算术运算符直接对其对象进行数学运算,必须调用相对应的方法。方法中的参数必须是BigDecimal的对象。

Java之BigDecimal详解可见参考链接https://www.cnblogs.com/zhangyinhua/p/11545305.html

9.以下代码的输出结果是什么?为什么会有这样的输出结果?

int X=100;

int Y=200;

System.out.println("X+Y="+X+Y);

System.out.println(X+Y+"=X+Y"); 

运行结果:

在System.out.println()中,如果在string字符串后面是+和变量,会把变量转换成string类型,加号起连接作用,然后把两个字符串连接成一个新的字符串输出;如果先有变量的加减运算再有字符串,那么会从左到右先计算变量的加减,然后再与后面的string结合成一个新的字符串。也就是说加号只有在两个string类型或者其中一个是string类型的时候才起到连接作用,否则仍然是运算符。

原文地址:https://www.cnblogs.com/wangdayang/p/13783022.html