零碎知识点汇总
1、枚举类型的检验
运行下列代码,有何结果?
1 package demo; 2 public class EnumTest { 3 4 public static void main(String[] args) { 5 Size s=Size.SMALL; 6 Size t=Size.LARGE; 7 //s和t引用同一个对象? 8 System.out.println(s==t); 9 //是原始数据类型吗? 10 System.out.println(s.getClass().isPrimitive());//getClass()表示获得当前对象的类型。 11 //isPrimitive()确定s.getClass()是否为一个基本类型(但很显然不是,因为是我们自己定义的) 12 //从字符串中转换 13 Size u=Size.valueOf("SMALL"); 14 System.out.println(s==u); //true 15 //列出它的所有值 16 for(Size value:Size.values()){ 17 System.out.println(value); 18 } 19 } 20 21 } 22 enum Size{SMALL,MEDIUM,LARGE};
运行结果为:false false true SMALL MEDIUM LARGE。
结果分析:1)Size s=Size.SMALL;Size t=Size.LARGE;所以很显然,s并不等于t。2)因为s是自己定义的枚举类型,所以不是一个基本类型,所以是false。3)因为u和s引用的是同一个对象,所以相等。4)for循环输出Size内部的值。
2、变量的作用域
Java变量是有作用域的。如果两个作用域完全不同的变量同名,不会引起冲突。就好比一班和二班都有人叫奥巴牛,在一班和二班分开上课的时候,点名就不会有冲突。如果一个班有两个奥巴牛,那就会产生冲突。
但是如果类里面定义一个x,在这个类的函数中也定义一个x,这种情况不会冲突,默认会优先使用函数中的x,这算是有冲突但是用默认谁优先来解决,这算是一种特殊情况。
检验如下:
从实验结果来看,当有同名变量时,会优先使用函数中的变量。
3、Java中的类型转换
实线箭头表示无精度损失,虚线箭头表示有精度损失。
byte占1个字节,取值范围为-128~127;
short占2个字节,取值范围为-32768~32767;
int占4个字节,取值范围为-2147 483 648~2147 483 647;
long占8个字节,取值范围为-9223 372 036 854 775 808~9223 372 036 854 775 807;
char占2个字节,取值范围为-128~127;
float占4个字节,取值范围为3.4E-38~3.4E+38;
double占8个字节,取值范围为1.7E-308~1.7E+308;
由以上知识,可以得知,由整型转换成浮点型时,是会损失精度的。而整型之间的转换不会损失精度。
4、为何doube类型的数值运算得不到“数学上精确”的结果?
有如下程序:
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)); } }
结果截图如下:
为何结果是这样的呢?为何double型的数值运算得不到精确的结果呢?
因为在十进制转换为二进制的时候可能会不准确(如:2.2),这样就导致了误差问题,所以在浮点数表示中,都可能会不可避免的产生些许误差!在单精度转换为双精度的时候,也会存在同样的误差问题。
详细参见:http://www.cnblogs.com/xugang/archive/2010/05/04/1727431.html
5、字符联接操作
The sum is " + sum 使用运算符 + 连接字面量“The sum is” 和计算结果 sum将String 和其它数据类型相加,结果是一个新的String。
实例程序代码:
1 public class Try { 2 3 public static void main(String[] args) { 4 int X=100; 5 int Y=200; 6 System.out.println("X+Y="+X+Y); 7 System.out.println(X+Y+"=X+Y"); 8 9 } 10 11 }
结果截图:
结果分析:
"X+Y="+X+Y 先输出左边的字符串,此处的+X+Y表示和其它数据类型相加,结果是一个新的String。所以直接在后面加上X和Y的值。
X+Y+"=X+Y"左边因为X和Y都是int型的数据,所以X+Y就是它们的和,即300。