课后实验

【动手动脑】

仔细阅读示例:

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

posted @ 2016-10-08 09:31  陶雨洁  阅读(141)  评论(0编辑  收藏  举报