题目要求:将课程中的所有动手动脑的问题以及课后实验性的问题,整理成一篇文档,以博客形式发表在博客园
问:一个Java类文件中真的只能有一个公有类吗?请使用Eclipse或javac检测一下以下代码,有错吗?
答:Java可以有内部类,我今天上午刚看的书,内部类在图形界面那块很有用,使用内部类可以轻松实现对两对象的监听。
问:请依据你的试验结果调整前页的描述,使其更为准确,后面的课程中将学习接口(interface),这里关于公有类的结论是否同样可用于接口?
答:Java中只能有一个继承,但是可以有多个接口。
问:main 方法必须严格象上面那样声明public void static main(String[] args)?void 表明 main 方法不返回任何结果。课堂动手试验:把main()方法的返回值由 void 改为 int ,程序能编译通过吗?能运行吗?
答:JVM有限制,main不能有返回值。JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。如果把void改成int程序不能运行。
问:为什么java规定作为程序入口点的main() 方法静态的?
答:static的main方法可以直接被jvm调用,不用先new出实例再执行。我们在编译一段java代码时,解释器就是在当前的包含main的类当中去调用静态的main方法,而不需要产生这个类的对象,我们加载这个类时,main方法也被加载作为java程序的入口。
问:Java变量遵循“同名变量的屏蔽原则”,请课后阅读相关资料弄清楚相关知识,然后自己编写一些测试代码,就象本示例一样,有意识地在不同地方定义一些同名变量,看看输出的到底是哪个值。
答:编写程序如下:
public class SameName {
public static int value=1;
public static void main(String[] args)
{
SameName a=new SameName();
a.go1();
a.go2();
int value=0;
System.out.println("main:"+value);
}
public void go1()
{
int value=3;
System.out.println("void go1:"+value);
}
public void go2()
{
System.out.println("void go2:"+value);
}
}运行结果是
void go1:3
void go2:1
main:0
也就是说类的value是自己的value,main中的value也是自己的value,在mian中声明的value屏蔽了类里的value,go1里的value屏蔽了类里的value。
问:为什么double类型的数值进行运算得不到“数学上精确”的结果?请通过互联网查找资料,或者是阅读相关计算机教材,解决这个问题。
提示:这个问题,与浮点数在计算机内部的表示方法有关系。可以使用这个知识在搜索引擎中查找相关资料
答:我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。举个例子:比如要用4bit来表示小数3.26,从高到低位依次对应2的1,0,-1,-2次幂,根据最上面的分析,应当在二进制数11.01(对应十进制的3.25)和11.10(对应十进制的3.5)之间选择。
问:在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。(为什么会这样呢?)
答:在Java中写入new BigDecimal(0.1) 所创建的 BigDecimal 实际上不等于 0.1,
这是因为 0.1 无法准确地表示为 double(或者说不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于0.1(虽然表面上等于该值)。所以在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。