课后作业

1,JAVA的基本运行单位是类还是方法?
类,因为没有一个方法可以独立存在。方法在逻辑上,要么属于类要么属于对象。
2,类由什么组成?
类由两部分组成:属性(特征) 和 方法(行为)
3,变量的类型,相互之间可以转换吗?
1)自动类型转换:byte->short->int->long->float->double,char->int->long->float->double。
2)强制类型转换:如果希望自动转换中,箭头右边的类型转换成左边的类型,则必须进行强制类型转换。
强制类型转换的语法格式:(targetType)value,强制类型转换的运算符是圆括号(())。
3)表达式类型的自动提升: a)所有的byte类型,short类型和char类型将被提升到int类型。
b) 整个算术表达式的数据类型自动提升到表达式中最高等级操作数同样的类型。
4,String是一个数据类型吗?
java 中String 是个对象,是引用类型 ,基础类型与引用类型的区别是,基础类型只表示简单的字符或数字,引用类型可以是任何复杂的数据结构 ,基本类型仅表示简单的数据类型,引用类型可以表示复杂的数据类型,还可以操作这种数据类型的行为 。
java虚拟机处理基础类型与引用类型的方式是不一样的,对于基本类型,java虚拟机会为其分配数据类型实际占用的内存空间,而对于引用类型变量,他仅仅是一个指向堆区中某个实例的指针。
5、static代表的含义?
static:静态的,用于修饰成员(成员变量,成员方法);

1)被static所修饰的变量或者方法会储存在数据共享区;

2)被static修饰后的成员变量只有一份!

3)当成员被static修饰之后,就多了一种访问方式,除了可以被对象调用之外,还可以直接

被类名调用,(类名.静态成员)。


动手动脑


仔细阅读示例: EnumTest.java,运行它,分析运行结果,你能得到什么结论?你掌握了枚举类型的基本用法了吗?

EnumTest.java:

public class EnumTest {

public static void main(String[] args) {
Size s=Size.SMALL;
Size t=Size.LARGE;

System.out.println(s==t);

System.out.println(s.getClass().isPrimitive());

Size u=Size.valueOf("SMALL");
System.out.println(s==u);

for(Size value:Size.values()){
System.out.println(value);
}
}

}
enum Size{SMALL,MEDIUM,LARGE};

运行结果:

false
false
true
SMALL
MEDIUM
LARGE

结论:
枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。

枚举类型的基本用法:
1)枚举类型是常量,不是变量,不能用赋值语句再对他进行赋值。
2)如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。

 

动手实验


请运行以下代码(TestDouble.java)

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

运行结果:
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999


结论:
使用double类型的数值进行计算,其结果是不精确的。

1)为什么double类型的数值进行运算得不到“数学上精确”的结果?
二进制小数无法精确表达10进制小数的含义。

2)怎样处理精度损失?
解决方法——使用BigDecimal类

例:
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));
}
}

 

运行结果:

下面使用String作为BigDecimal构造器参数的计算结果:
0.05 + 0.01 = 0.06
0.05 - 0.01 = 0.04
0.05 * 0.01 = 0.0005
0.05 / 0.01 = 5
下面使用double作为BigDecimal构造器参数的计算结果:
0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125
0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125
0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125
0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125

3)注意:在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。为什么会这样呢?
double+、-不能准确的代表BigDecimal(String) 16位有效数以上的数字在使用BigDecimal时,应用*、/构造器创建对象才有意义。
BigDecimal所创建的对象不能使用传统的等算术运算符直接对其对象进行数学运算,而必须调用相对应的方法。方法中的参数必须是BigDecimal的对象。


动手动脑

1)以下代码的输出结果是什么?
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

 


2)为什么会有这样的输出结果?
“+”表示连接两字符,计算结果是将X和Y将两数据连接。
“+”是运算符,是对X和Y求和

 

posted on 2019-09-18 10:26  Mrsen  阅读(182)  评论(2编辑  收藏  举报

导航