zoukankan      html  css  js  c++  java
  • 动手动脑问题分析

    一、仔细阅读示例: EnumTest.java,运行它,分析运行结果?代码如下

    package test;

    public class EnumTest {

    public static void main(String[] args) {

    Size s=Size.SMALL;

    Size t=Size.LARGE;

    //st引用同一个对象?

    System.out.println(s==t);  //

    //是原始数据类型吗?

    System.out.println(s.getClass().isPrimitive());

    //从字符串中转换

    Size u=Size.valueOf("SMALL");

    System.out.println(s==u);  //true

    //列出它的所有值

    for(Size value:Size.values()){

    System.out.println(value);

    }

    }

    }

     enum Size{SMALL,MEDIUM,LARGE};

    运行结果如下:

    false

    false

    true

    SMALL

    MEDIUM

    LARGE

    分析:1、对象s,t都是将字符串转化为枚举但是因为字符串不同所以st不相等输出false

    2、getClass()函数作用是获取对象的类型类,isPrimitive()getClass()中的方法作用是判断该类型是否是基本类型,枚举不是基本类型故输出false

    3、Valueof()函数是将字符串转换为其他类型,在此程序中将”SMALL”转换为枚举,故su相等输出true

    4、Values()函数是将枚举中的常量遍历,通过for循环输出

    你能得到什么结论?你掌握了枚举类型的基本用法了吗?

    结论:枚举不是基本类型,对于声明为 enum 的类型,编译器会自动生成 一个继承 java.lang.Enum 的类,并且生成 valueOf 和 values() 方法

    掌握了两种将字符串转换为枚举的方法

    1.Size s=Size.SMALL;

    2.Size u=Size.valueOf("SMALL");

    还有遍历枚举常量并输出的方法。

    二、动手实验代码如下

    public class TestDouble {

        public static void main(String args[]) {

            System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));

            System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));

            System.out.println("4.015 * 100 = " + (4.015 * 100));

            System.out.println("123.3 / 100 = " + (123.3 / 100));

        }

    }

    运行结果:

    0.05 + 0.01 = 0.060000000000000005

    1.0 - 0.42 = 0.5800000000000001

    4.015 * 100 = 401.49999999999994

    123.3 / 100 = 1.2329999999999999

    结论:使用double类型的数值进行计算,其结果是不精确的。

    原因:这个涉及到二进制与十进制的转换问题。
    N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×10²+2×10+3×(100次幂)+4×(10-1次幂);其它进制的也是同理,例如二进制数11.01=1×2+1×(20次幂)+0+1×(2-2次幂)=十进制的3.25
    double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2n次方)。

    举个例子来说,比如要用4bit来表示小数3.26,从高到低位依次对应21,0,-1,-2次幂,根据最上面的分析,应当在二进制数11.01(对应十进制的3.25)11.10(对应十进制的3.5)之间选择。
    简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。

    解决方法:使用BigDecimal

    三、以下代码的输出结果是什么?

    int X=100;

    int Y=200;

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

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

    运行结果:

    X+Y=100200

    300=X+Y

    出现此结果的原因:System.out.println()函数中的非字符串+有两个作用,分别是字符连接和数据运算。而要是数据运算必须加括号(在开头可省略括号),其他情况就是字符串连接。

    题目中第一个是起连接作用而第二个是运算。

  • 相关阅读:
    apt-clone安装与使用
    利用异或求(整数数组中,有2K+1个数,其中有2k个相同,找出不相同的那个数)
    运行程序,填写结果
    throw与throws的区别
    牛客网多线程程序执行结果选择题
    一个继承了抽象类的普通类的执行顺序
    int i=0;i=i++
    HashMap浅入理解
    &&和&、||和|的区别
    System.out.println()
  • 原文地址:https://www.cnblogs.com/chenaiiu/p/11543517.html
Copyright © 2011-2022 走看看