00动手动脑

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

 

运行程序结果:

 

定义一个枚举类Size

s为Size中的SMALL

t为Size中的LARGE

1.判断s与t是否相等,输出false

2.判断s是原始数据类型,原始数据类型(boolean、char、byte、short、int、long、float、double),不是输出false

3.valueOf()方法返回指定字符串值的枚举常量。u为Size中的SMALL,判断s与u是否相等,输出true

4.迭代输出Size中各元素

 

枚举类型的基本用法:

java枚举类用enum关键字定义,内部各常量用,分割

例:enmu Color{RED,GREEN,BLUE;}

枚举类的声明可在外部也可在内部类,EnumTest的例子在外部

这个是在内部

public class Test

{

  enmu Color{RED,GREEN,BLUE;}

  public static void main(String[] args)

  {

    Color c1=Color.RED;

    System.out.println(c1);

  }

}

输出结果:RED

利用for语句迭代枚举元素

EnumTest例子中就是迭代输出枚举各元素

 

 

 2

enmu Color{RED,GREEN,BLUE;}
public class MyClass {
  public static void main(String[] args) {
    for (Color myVar : Color.values()) {
      System.out.println(myVar);
    }
  }
}
输出结果:
RED
GREEN
BLUE

switch语句中使用枚举类:

enmu Color{RED,GREEN,BLUE;}
public class MyClass {
  public static void main(String[] args) {
    Color myVar = Color.BLUE;
    switch(myVar) {
      case RED:
        System.out.println("红色");
        break;
      case GREEN:
         System.out.println("绿色");
        break;
      case BLUE:
        System.out.println("蓝色");
        break;
    }
  }
}

 

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

反码:正数的反码还是等于原码;负数的反码就是他的原码除符号位外,按位取反。

补码:正数的补码等于他的原码,负数的补码等于反码+1

原码:是最简单的机器数表示法。用最高位表示符号位,1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。

原码、补码、反码的深入理解与原理

首先先猜想是由原码表示,程序验证

1         int a=1;

2         int b=-1;

3         int sum=a+b;

4         System.out.println(sum);

 

可知程序的结果为0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。显然出错,故java中数值并非是由原码储存

同理,在使用反码表示时,也会出现同样的问题: (00000001) + (11111110)= (11111111)= ( -0 )

而在补码中这没有这个问题:(00000001)+ (11111111)= (00000000)= ( 0 )

结论:java中,数值是由补码表示的

   (摘自:   https://www.cnblogs.com/heiyang/p/9748054.html  )

 

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

 

package day02;

public class Test {

    private static int value=1;    

    public static void main(String[] args) {

        int value=2;

        System.out.println(value);

    }

}

结果为  2

 

 

 

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

 

java中有8种基本数据类型:byteintshortlongbooleancharfloatdouble

 

对应的类为:ByteIntShortLongBooleanCharecterFloatDouble

 

逻辑型:boolean

 

文本型:char

 

整数型:byteshortintlong

 

浮点型:floatdouble

 

byte:    1字节 -128~127

 

short:   2字节 -2^15~2^15-1

 

int :      4字节 -2^31~2^31-1

 

long:    8字节 -2^63~2^63-1

 

boolean:1字节 true falsejava中不能以0或非0代替)

 

float:    4字节 -3.403E38~3.403E38

 

double8字节 -1.798E308~- 4.9E324

 

char:    2字节  ’\u0000~‘ ’\uffff (16进制的,换算过来即0~65535)

 

1字节等于8位)

 

结论:由基本到复杂。

 

除了使用C的强制类型转换方式,还可以通过原始类型的包装类完成类型转换。

 

 

适用场景:同一个数据需要转换为多种类型,并且这一数据需要比较长期的使用。多数情况下,推荐直接使用强制类型转换的方式。

 

 TestDouble.java

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

    }

}

 

 

 

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

 

 

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

int X=100;

int Y=200;

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

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

为什么会有这样的输出结果?

 

输出语句1里“+”为连接运算,与("X+Y="+(X+Y));不同,输出字符串“X+Y=”与X与Y,输出语句2里第一个“+”为加法运算符,第二个“+”为连接运算符。

 

字符串转为数字的基本方法:

 

int number =Integer.parseInt(numberString);

lnteger属于包 java.lang,它封装了一个int类型的整数,因此,它是原始数据类型int的“包装类”。

 

 

字符串转为浮点数: 

 

number1=Double.parseDouble(firstNumber);

number2=Double.parseDouble(secondNumber);

 

 

posted @ 2021-09-24 22:55  慢漫曼蔓  阅读(35)  评论(0)    收藏  举报