动手动脑的问题以及课后实验性的问题
动手动脑一:枚举
程序代码:
public class EnumTest {
程序代码:
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);
}
}
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};
运行结果:
false
false
true
SMALL
MEDIUM
LARGE
分析:ENUM类似一个类,与类的用法相差不多。
用法:
1.System.out.println(s==t)可以直接判断是否相等
2. for (EnumTest e : EnumTest.values()) {
System.out.println(e.toString());
}遍历枚举类型中的所有值
3.Size u=Size.valueOf("SMALL")字符串转换,进行赋值
动手动脑二:原码、补码、反码
原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
反码:正数的反码还是等于原码。负数的反码就是他的原码除符号位外,按位取反。
补码:正数的补码等于他的原码。负数的补码等于反码+1。
通过操作可知java中的数是用补码表示的。
动手动脑三:类型转换
byte(字节型):1字节 128~127
char(字符型):2字节 0~65535
short(短整型):2字节 2^15~2^15-1
int(整型):4字节 2^31~2^31-1
long(长整型):8字节 2^63~2^63-1
float(单精度浮点型):4字节 3.403E38~3.403E38
double(双精度浮点型):8字节 1.798E308~- 4.9E324
boolean:1字节 true false
类型转换原则:从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类型转换。
动手实验四:
程序代码:
public class TestDouble {
enum Size{SMALL,MEDIUM,LARGE};
运行结果:
false
false
true
SMALL
MEDIUM
LARGE
分析:ENUM类似一个类,与类的用法相差不多。
用法:
1.System.out.println(s==t)可以直接判断是否相等
2. for (EnumTest e : EnumTest.values()) {
System.out.println(e.toString());
}遍历枚举类型中的所有值
3.Size u=Size.valueOf("SMALL")字符串转换,进行赋值
动手动脑二:原码、补码、反码
原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
反码:正数的反码还是等于原码。负数的反码就是他的原码除符号位外,按位取反。
补码:正数的补码等于他的原码。负数的补码等于反码+1。
通过操作可知java中的数是用补码表示的。
动手动脑三:类型转换
byte(字节型):1字节 128~127
char(字符型):2字节 0~65535
short(短整型):2字节 2^15~2^15-1
int(整型):4字节 2^31~2^31-1
long(长整型):8字节 2^63~2^63-1
float(单精度浮点型):4字节 3.403E38~3.403E38
double(双精度浮点型):8字节 1.798E308~- 4.9E324
boolean:1字节 true false
类型转换原则:从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类型转换。
动手实验四:
程序代码:
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类型的数值进行计算,其结果是不精确的。Float和Double类型为我们提供快速运算,然而由于在转换为二进制的时候,有些数字不能完全转换,只能无限接近原本的值,从而导致运算结果不正确的问题。
动手动脑五:
程序代码:
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("X+Y="+X+Y)先输出"X+Y="接下来进行"X+Y="+X也就是输出“X+Y=100”,最后在输出X+Y=100200。而System.out.println(X+Y+"=X+Y"),由于X+Y不是字符串,于是就先进行计算后再输出。
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类型的数值进行计算,其结果是不精确的。Float和Double类型为我们提供快速运算,然而由于在转换为二进制的时候,有些数字不能完全转换,只能无限接近原本的值,从而导致运算结果不正确的问题。
动手动脑五:
程序代码:
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("X+Y="+X+Y)先输出"X+Y="接下来进行"X+Y="+X也就是输出“X+Y=100”,最后在输出X+Y=100200。而System.out.println(X+Y+"=X+Y"),由于X+Y不是字符串,于是就先进行计算后再输出。
课堂测试:
程序代码:
package ceshi;
import java.util.Random;
import java.util.*;
import java.util.Random;
import java.util.*;
public class CeShi {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
Random random = new Random();
int z=1;
for(int i=0;i<30;i++) {
int ran1= random.nextInt(4);
if(ran1==0) {
int ran2 = random.nextInt(100);
int ran3 = random.nextInt(100);
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
Random random = new Random();
int z=1;
for(int i=0;i<30;i++) {
int ran1= random.nextInt(4);
if(ran1==0) {
int ran2 = random.nextInt(100);
int ran3 = random.nextInt(100);
System.out.println(z+" "+ran2+"+"+ran3+"=");
z++;
}
if(ran1==1) {
int ran4 = random.nextInt(100);
int ran5 = random.nextInt(100);
if(ran4>ran5)
System.out.println(z+" "+ran4+"-"+ran5+"=");
z++;
}
if(ran1==2) {
int ran6 = random.nextInt(100);
int ran7 = random.nextInt(100);
System.out.println(z+" "+ran6+"*"+ran7+"=");
z++;
}
if(ran1==3) {
int ran8 = random.nextInt(100);
int ran9 = random.nextInt(100);
System.out.println(z+" "+ran8+"/"+ran9+"=");
z++;
}
}
}
z++;
}
if(ran1==1) {
int ran4 = random.nextInt(100);
int ran5 = random.nextInt(100);
if(ran4>ran5)
System.out.println(z+" "+ran4+"-"+ran5+"=");
z++;
}
if(ran1==2) {
int ran6 = random.nextInt(100);
int ran7 = random.nextInt(100);
System.out.println(z+" "+ran6+"*"+ran7+"=");
z++;
}
if(ran1==3) {
int ran8 = random.nextInt(100);
int ran9 = random.nextInt(100);
System.out.println(z+" "+ran8+"/"+ran9+"=");
z++;
}
}
}
}
运行结果:
1 59-52=
2 87*58=
3 53-23=
4 66/1=
5 65/58=
7 70+24=
8 39/97=
9 82-39=
10 51*4=
11 22/25=
12 54/29=
13 64*47=
14 37/81=
15 1+5=
16 45+13=
17 70*85=
18 79+25=
19 50*34=
20 69-8=
21 93-30=
22 23/8=
23 72-51=
24 44+0=
25 62*43=
26 57*71=
27 92+52=
28 88/24=
29 68*38=
30 20+22=
2 87*58=
3 53-23=
4 66/1=
5 65/58=
7 70+24=
8 39/97=
9 82-39=
10 51*4=
11 22/25=
12 54/29=
13 64*47=
14 37/81=
15 1+5=
16 45+13=
17 70*85=
18 79+25=
19 50*34=
20 69-8=
21 93-30=
22 23/8=
23 72-51=
24 44+0=
25 62*43=
26 57*71=
27 92+52=
28 88/24=
29 68*38=
30 20+22=