课程任务二:
1、质疑:
验证以下代码:
验证结果:
程序出错,java程序中可以有多个类,但共有类只能有一个,且与类名相同。
2、课堂动手实验:
把main()方法的返回值由 void 改为 int ,程序能编译通过吗?能运行吗?
结果:
不能
3、思索:
为什么java规定作为程序入口点的main() 方法静态的?
答:非静态成员函数在执行前必须先构造并实例化该函数所在的类。
如果允许非静态的main,那么main函数所在的类必须先进行实例化,
那么就需要再写个函数去实例化main所在的类,再调用main,这个实例化代码又写在哪呢?如果它也是非静态的,岂不是又要写个函数去实例化它所在的类嘛?
因此,JAVA语言就规定了main必须是静态的
4、课后练习:
Java变量遵循“同名变量的屏蔽原则”,请课后阅读相关资料弄清楚相关知识,然后自己编写一些测试代码,就象本示例一样,有意识地在不同地方定义一些同名变量,看看输出的到底是哪个值。
实验:
结果输出2。
原因:因为在java中,局部定义的变量能够覆盖全局范围内的变量。在局部使用某个变量的时候JVM会优先找和当前使用位置"近"的变量的的定义!如果在局部定义了和全局变量一样的名字,我们使用的过程中,调用全局变量的话,会使用this关键字辅助。
5、问原因:
为什么double类型的数值进行运算得不到“数学上精确”的结果?
答案:这个涉及到二进制与十进制的转换问题。
N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×10²+2×10+3×(10的0次幂)+4×(10的-1次幂);其它进制的也是同理,例如二进制数11.01=1×2+1×(2的0次幂)+0+1×(2的-2次幂)=十进制的3.25。
double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。
解决方案:使用BigDecimal类
在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。(为什么会这样呢?)
答案:double+、-不能准确的代表BigDecimal(String) 16位有效数以上的数字在使用BigDecimal时,用*、/构造器创建
对象。BigDecimal所创建的对象不能使用传统的等算术运算符直接对其对象进行数学运算,必须调用相对应的方法。
方法中的参数必须是BigDecimal的对象。
6、动手动脑:
以下代码的输出结果是什么?
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
为什么会有这样的输出结果?
结果:
原因:语句一的+是连接符,用来连接X Y 两个变量,所以输出的时候是100与200的值语句二的+是加法运算符,用来做X+Y运算,输出的是100+200之后的值