课后实验
【动手动脑】
仔细阅读示例:
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");//给u赋值
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
分析结果:s与t不是引用的同一个对象flase;8种原始类型byte,char,short,int,long,float,double,boolean,所以s.getClass().isPrimitive()是enum返回flase;s与u都是SIZE类中的SMALL,为同一个对象,所以是true.
结果思考:
枚举型不是原始数据类型是应用类型 ,枚举型判断==与.equals()一样都是判断值。
枚举用法:
1枚举的定义枚举类型定义的一般形式为:enum 枚举名{ 枚举值表 };
2枚举变量的说明 如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。
设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:
enum weekday{ sun,mou,tue,wed,thu,fri,sat };
enum weekday a,b,c;
或者为:enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;
或者为:enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;
3枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1,…,sat值为6
main(){ enum weekday { sun,mon,tue,wed,thu,fri,sat } a,b,c; a=sun; b=mon; c=tue;}
说明: 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。
如: a=sum; b=mon;是正确的。而: a=0; b=1;是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。
如: a=(enum weekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于: a=tue;
另外说明:
还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。
【动手实验】
请运行以下代码(TestDouble.java)
你看到了什么样的输出,意外吗?为什么double类型的数值进行运算得不到“数学上精确”的结果?
请通过互联网查找资料,或者是阅读相关计算机教材,解决这个问题。 提示: 这个问题,与浮点数在计算机内部的表示方法有关系。可以使用这个知识在搜索引擎中查找相关资料
运算结果:
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999
分析结果:
不同进制数值进行运算,double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是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
分析结果:
因为第一个是“x+y=”字符串打头所以+系统理解为是字符串相加,第二个x+y就是整型相加。
Addtion用消息框求和内容:
首先import是引用的意思,import javax.swing.JOptionPane。JOptionPane 是有助于方便地弹出要求用户提供值或向其发出通知的标准对话框。
输入first_Number=
JOptionPane.showInputDialog("Enter first number");
输出JOptionPane.showMessageDialog(
null,"The sum is "+sum,"Results",
JOptionPane.PLAIN_MESSAGE);
java保存数据是默认为字符串保存,要将字符串转换为整型数字并进行运算
将字符串转换为整型int number1=Integer.parseInt(first_Number);
将字符串转换为double型double number2 = Double.parseDouble(str);
Enum判断是否为原始数据类型:
首先Java原始数据类型包括byte、int、char、long、float、double、boolean和short。原始数据类型保存在栈中,保存的是实际值;引用类型也保存在栈中,保存的是一个实际对象的地址。当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
基本型别 | 大小 | 最小值 | 最大值 |
boolean | ----- | ----- | ------ |
char | 16-bit | Unicode 0 | Unicode 2^16-1 |
byte | 8-bit | -128 | +127 |
short | 16-bit | -2^15 | +2^15-1 |
int | 32-bit | -2^31 | +2^31-1 |
long | 64-bit | -2^63 | +2^63-1 |
float | 32-bit | IEEE754 | IEEE754 |
double | 64-bit | IEEE754 | IEEE754 |
void |
Random判断随机数:
计算机产生6位随机数可以一次一次的产生然后连接,也可以产生0~999999的数
import java.util.*;其中Scannerr类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。
for(int i=0;i<6;i++)
{
int intVal=(int)(Math.random()*26+97);
result=result+(char)intVal;
}
或者
java.util.Random random=new java.util.Random();定义随机数
int result= random.nextInt(99)产生0~99的随机数
SwitchTest画图:
首先import java.awt.Graphics中awt是Java虚拟工具包。
public class SwitchTest extends JApplet{、、、、}后面加的extends JApplet
g.drawLine, g.drawRect,g.drawOval,画图选择。
ps:其实我没大懂55
Test字符串相连的问题:
int X=100; int Y=200;
System.out.println("X+Y="+X+Y); System.out.println(X+Y+"=X+Y");
结果显示是1.x+y=100200 2.300=x+y
因为第一个是“x+y=”字符串打头所以+系统理解为是字符串相加,第二个x+y就是整型相加。
TestBigDeccimal:
为了解决基本数据类型浮点数不能进行精确计算的问题,Java中专门提供了java.math.BigDecimal类,调用import java.math.BigDecimal其提供浮点数的精确计算功能。
加" "与不加" "的区别:加了是表示规定数据格式-保留数据的位数,不加是无限小数double类型.
2
3
|
BigDecimal d = new BigDecimal( 1.0 / 3.0 ); //定义一个无限小数 DecimalFormat df = new DecimalFormat( "0.00" ); //定义数据格式,保留两位小数 |
通过调用bigdecimal:
加:f1.add(f2) 减:f1.subtract(f2) 乘:f1.multiply(f2) 除:f1.divide(f2)-----同样是将f2类型转换为f1类型。
BigDecimal f1 =new BigDecimal("0.05");
BigDecimal f2= BigDecimal.valueOf(0.01);
BigDecimal f3=new BigDecimal(0.05);
不懂这三个的区别是什么?
TestDouble:
与上题字符串有关联,加了括号运算次序不同。
此题System.out.println("0.05+0.01="+(0.05+0.01));
System.out.println("0.05+0.01="+0.05+0.01);