课堂作业1.0
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};
分析以上代码的原因:创建枚举类型的变量s和t,他们不是引用的同一个对象。并利用语句s.gerClass().isprimitive()判断是否为原始数据类型。不是。然后定义枚举类型的变量u,并给予字符串类型的初值"SMALL",判断s==u,结果为相等。最后遍历所有的数据。枚举数据类型不是原始数据类型,可以与其他数据判断是否相等。枚举的本质是类,枚举的遍历需要values()方法。valueOf()代码中使用是将"SMALL"转化为Size类型。枚举不是原始数据类型,他的每个具体值都引用一个特定的对象,相同的值引用相同的对像。
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));
}
}
结果为:
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999
为什么double数据类型的数值运算得不到精确结果,由于运算时转化为计算机机器数再运算,转化为二进制,再转化为二进制时小数部分存储部分位数不够,出现无限循环小数,导致出现误差。
改进方法为:
import java.math.BigDecimal;
public class TestBigDecimal
{
public static void main(String[] args)
{
BigDecimal f1 = new BigDecimal("0.05");
BigDecimal f2 = BigDecimal.valueOf(0.01);
BigDecimal f3 = new BigDecimal(0.05);
System.out.println("下面使用String作为BigDecimal构造器参数的计算结果:");
System.out.println("0.05 + 0.01 = " + f1.add(f2));
System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
System.out.println("0.05 / 0.01 = " + f1.divide(f2));
System.out.println("下面使用double作为BigDecimal构造器参数的计算结果:");
System.out.println("0.05 + 0.01 = " + f3.add(f2));
System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
System.out.println("0.05 / 0.01 = " + f3.divide(f2));
}
}
在构建BigDecimal对象时应使用字符串而不时double数值,否则仍然会出现计算精度问题。因为如果还是double数据,还是会转化为二进制数据,仍然出现误差。
public class Dog {
public static void main(String[] args){
int a=100;
int b=200;
System.out.println(a+b+"=a+b");
System.out.println("a+b="+a+b);
}
}
结果为:
300=a+b
a+b=100200
为什么会是这样的结果:
由于第一个输出语句a+b位于前面,不用加括号,即可得到想要的结果,第二个加号为字符串链接符号。
而第二个输出语句,由于a+b位于后面,需要加括号,否则将会被认为是字符串链接的符号"+"。
java变量遵循”同名变量屏蔽原则“:
public class Dog {
public static void main(String[] args){
int a=100;
System.out.println(a);
prints();
System.out.println(a);
}
public static void prints() {
int a=10;
System.out.println(a);
}
}
输出结果为:
100
10
100
则可知每个变量都有一个有效区域,即定义的那片区域,出了这个区域,变量将不再有效。然而全局变量除外。
java的基本运行单位是类,java把每一个可执行的成分都变成类。类由什么组成:成员变量,成员方法。
变量类型相互之间可以转换吗,可以转换。
String是引用数据类型,Java中的字符串String属于引用数据类型。
static含义是属于类但不属于类对象的变量和函数。多个对象访问和修改static所修饰的成员变量时,其中一个对象对该成员变量进行了修改,其他对象的成员值也跟着改变。多个对象共享一个static变量。静态的方法不可被重写。
原码补码反码:
原码:最高位为符号位,0表示正数,1表示负数,非符号位为该数字绝对值的二进制。
反码:正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(符号位)不变。
补码:正数的补码与原码一致,负数的补码按位取反加1。
就比如7:
原码:0111 补码:0111 反码:0111
-7 原码:1111 反码:1000 补码:1001
如果是补码转化为原码:比如-7
补码:1001 位数取反加1符号位不变 原码:1111