问题一:仔细阅读示例: 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};
运行结果:
结论:1.引用同一枚举类型名中枚举表中的不同常量,引用的并不是一个对象,
2.每个具体值都引用一个特定的对象,相同的值则引用同一个对象。
3.枚举是可以从字符串中转换。
4.可以使用“==”和equals()方法直接比对枚举变量的值
枚举类型的基本用法:
枚举常量是枚举类型中的值,即枚举值。枚举类型是一种用户定义的类型,只有用户在程序中定义它后才能被使用。
用户通常利用枚举类型定义程序中需要使用的一组相关的符号常量。
枚举类型的定义格式为:enum <枚举类型名> {<枚举表>};
问题二:请运行以下代码(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)); } }
结果:
结论:
这个涉及到二进制与十进制的转换问题。
N进制可以理解为:数值×基数的幂
double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。
举个例子来说,比如要用4bit来表示小数3.26,从高到低位依次对应2的1,0,-1,-2次幂,根据最上面的分析,应当在二进制数11.01(对应十进制的3.25)和11.10(对应十进制的3.5)之间选择。
简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
如果涉及到精确数字,更适合用字符串而不是double类型,必要时我们要选取string类型的字符串类型来计算更加精确的结果。
问题三:以下代码的输出结果是什么?
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(100),再输出y(200)
System.out.println(X+Y+"=X+Y");//先进行求和,遇到string类型后按照string类型输出
Java中的加号有时是连接符,有时是运算符:
1.当左右两边连接的都是非数字型时,则为连接符。
2.当一边是数值类型,另一边是非数值类型时,则为连接符。
3.当两边都是数值类型时,则为运算符,即相加求和的作用。
问题四:阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。
结论:
原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
如单字节的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数:正数的反码与原码相同。负数:负数的反码,符号位为“1”,数值部分按位取反。可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算。
如单字节的5的反码为:0000 0101;-5的反码为1111 1010。
补码:正数的补码就是其本身。负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)。对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值。
如单字节的5的补码为:0000 0101;-5的原码为1111 1011。
示例程序:
import java.util.Scanner;
public class ZJF {
public static void main(String[] args)
{
int a=5;
int b=-5;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(b));
}
}
结论:正数采用原码,负数采用补码。
问题五.Java变量遵循“同名变量的屏蔽原则”,请课后阅读相关资料弄清楚相关知识,然后自己编写一些测试代码,就象本示例一样,有意识地在不同地方定义一些同名变量,看看输出的到底是哪个值。
结论:每个变量都有一个有效区域,即定义的那片区域,出了这个区域,变量将不再有效。(全局变量除外)
问题六.查看Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?
结论: