课堂作业1.0

public class EnumTest {

public static void main(String[] args) {
    Size s=Size.SMALL;
    Size t=Size.LARGE;
    //s和t引用同一个对象?
    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};

分析以上代码的原因:创建枚举类型的变量s和t,他们不是引用的同一个对象。并利用语句s.gerClass().isprimitive()判断是否为原始数据类型。不是。然后定义枚举类型的变量u,并给予字符串类型的初值"SMALL",判断s==u,结果为相等。最后遍历所有的数据。枚举数据类型不是原始数据类型,可以与其他数据判断是否相等。枚举的本质是类,枚举的遍历需要values()方法。valueOf()代码中使用是将"SMALL"转化为Size类型。枚举不是原始数据类型,他的每个具体值都引用一个特定的对象,相同的值引用相同的对像。

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数据类型的数值运算得不到精确结果,由于运算时转化为计算机机器数再运算,转化为二进制,再转化为二进制时小数部分存储部分位数不够,出现无限循环小数,导致出现误差。

改进方法为:

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));
    }
}

 

 在构建BigDecimal对象时应使用字符串而不时double数值,否则仍然会出现计算精度问题。因为如果还是double数据,还是会转化为二进制数据,仍然出现误差。

public class Dog {

   public static void main(String[] args){
    int a=100;
    int b=200;
    System.out.println(a+b+"=a+b");
    System.out.println("a+b="+a+b);
    }
}

结果为:

300=a+b
a+b=100200

为什么会是这样的结果:

由于第一个输出语句a+b位于前面,不用加括号,即可得到想要的结果,第二个加号为字符串链接符号。

而第二个输出语句,由于a+b位于后面,需要加括号,否则将会被认为是字符串链接的符号"+"。

java变量遵循”同名变量屏蔽原则“:

public class Dog {
    public static void main(String[] args){
      int a=100;
      System.out.println(a);
      prints();
      System.out.println(a);
        }
      public static void prints() {
        int a=10;
        System.out.println(a);
          }
}

输出结果为:

100
10
100

则可知每个变量都有一个有效区域,即定义的那片区域,出了这个区域,变量将不再有效。然而全局变量除外。

java的基本运行单位是类,java把每一个可执行的成分都变成类。类由什么组成:成员变量,成员方法。

变量类型相互之间可以转换吗,可以转换。

String是引用数据类型,Java中的字符串String属于引用数据类型。

static含义是属于类但不属于类对象的变量和函数。多个对象访问和修改static所修饰的成员变量时,其中一个对象对该成员变量进行了修改,其他对象的成员值也跟着改变。多个对象共享一个static变量。静态的方法不可被重写。

原码补码反码:

原码:最高位为符号位,0表示正数,1表示负数,非符号位为该数字绝对值的二进制。

反码:正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(符号位)不变。 

补码:正数的补码与原码一致,负数的补码按位取反加1。

就比如7:

原码:0111  补码:0111  反码:0111

-7 原码:1111  反码:1000  补码:1001

如果是补码转化为原码:比如-7

补码:1001  位数取反加1符号位不变  原码:1111

posted @ 2022-09-11 07:29  一个小虎牙  阅读(17)  评论(0编辑  收藏  举报