*动手动脑:
问题1: 仔细阅读示例: EnumTest.java,运行它,分析运行结果?
源代码:
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};
运行结果
false
false
true
SMALL
MEDIUM
LARGE
问题二:你能得到什么结论?你掌握了枚举类型的基本用法了吗?
1 枚举类型等效于定义static finally 常量
2. 枚举类型可以有自己的属性(参数)和方法
3. 枚举类型可以以独立的文件存在
最简单的枚举类型:
public enum Belle {
para1, para2, para3, para4;
}
调用:
for (Belle belle : Belle.values()) { //遍历枚举中所有的对象
System.out.println(belle.name()); //输出每一个枚举的名称
}
要取出某个指定名称的枚举成员 可用 Belle.para1(注意:因为枚举对象默认是static final 其成员对象都是stastic 属性, 直接调用),也可以用 Belle.valueOf("para1")
稍复杂的枚举类型:
public enum Belle {
para1("this is para1"),
para2("this is para3"),
para3("this is para3"),
para4("this is para4");
public final String str; //定义枚举成员属性
Belle(String str) { //内部方法设定枚举成员属性
this.str = str;
}
}
这样就每一个枚举成员就有了属性,可以定义多个属性,每个属性必须在内部方法中set(例如this.str = str;)
调用时用这样的格式取值 belle.str
枚举成员就的属性可以不光是字符串,可以是任意对象
更复杂的枚举类型:
public enum Belle {
para1("this is para1") {
public String event() { //实现枚举成员的方法
return "i am a mtthod of para1";
}
},
para2("this is para3") {
public String event() { //实现枚举成员的方法
return "i am a mtthod of para2";
}
},
para3("this is para3") {
public String event() { //实现枚举成员的方法
return "i am a mtthod of para3";
}
};
public final String str; //定义枚举成员属性
Belle(String str) { //内部方法设定枚举成员属性
this.str = str;
}
public abstract String event();//定义枚举成员的方法
}
这样就每一个枚举成员就有了自己的方法,可以定义多个方法,方法必须以抽象方法的形式作声明(例如 abstract String event();) 一个方法一旦定义了就必须在每一个枚举成员中得到实现。
调用方法时用这样的格式 belle.event();
动手动脑:
看着这个图,再查查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会自动完成从低级类型向高级类型转换,即取值范围相对较小的数据类型转换成取值范围相对较大的数据类型。
输出结果:
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 作精确运 算的时候要特别小心。可以考虑采用一些替代方案来实现。如通过使用 long 类型来转换。我们知道在计算机中浮点数的表示方法是由一个整数(即尾数)乘以一个基数(计算机中一般为2)的整次幂得到。(类似于科学计数法,科学记数法基数为10)float的内存结构为:符号位表示正负,1位 指数位,8位 尾数位,32位(符号位1表示负,0表示正)指数是以2为底的,范围是 -128 到 127,如果超过了127,则从-128开始计。 即:127+1=-128尾数都省去了第1位的1,所以在还原时要先在第一位加上1。它可能包含整数和纯小数两部分,也可能只包含其中一部分,视数字大小而定。对于带有整数部分的浮点数,其整数的表示法有两种,当整数大于十进制的16777215时使用的是科学计数法,如果小于或等于则直接采用一般的二进制表示法。科学计数法和小数的表示法是一样的。小数部分则是直接使用科学计数法,形式是X * ( 2 ^ n )。这样就导致浮点类型在计算机的存贮中无法精确表示。
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)中的“+”为连接运算符,
System.out.println(X+Y+"=X+Y")中的“+”为加法运算符,即为两个数相加。
*课后练习:
阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。
在计算机内,定点数有3种表示法:原码、反码和补码。反码是数值存储的一种,但是由于补码更能有效表现数字在计算机中的形式,所以多数计算机一般都不采用反码表示数。
所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
原码10010= 反码11101 (10010,1为符号码,故为负)
(11101) 二进制= -2 十进制
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
课后作业:编写一个程序,用户输入两个数,求出其加减乘除,并用消息框显示计算结果。
import javax.swing.JOptionPane;
public class yusuan {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String firstNumber,secondNumber;
int number1,number2,sum,minus,multiply,divide;
// 从用户的第一个数字读为字符串
firstNumber =JOptionPane.showInputDialog( "输入第一个数" );
// 从用户的第二个数字读为字符串
secondNumber =JOptionPane.showInputDialog( "输入第二个数" );
// 从数字型的字符串转换为int型
number1 = Integer.parseInt( firstNumber );
number2 = Integer.parseInt( secondNumber );
// 运算这些数
sum = number1 + number2;
minus=number1 - number2;
multiply=number1*number2;
divide=number1/number2;
// 输出结果
JOptionPane.showMessageDialog(null,"和为: "+sum+" 差为:"+minus+" 积为:"+multiply+" 商为:"+divide,"Results",JOptionPane.PLAIN_MESSAGE);//在窗口上显示结果
System.exit(0);//释放空间
}
}
截图: