课程作业02:将课程中的所有动手动脑的问题以及课后实验性的问题,整理成一篇文档。

问题1:一个Java类文件中真的只能有一个公有类吗?请使用Ecplise或javac检测一下以下代码,有错吗?

一个java类文件中只能有一个公有类。用Ecplise测试,当public类嵌套在public类内部时,只执行与文件名相同的public类,不报错但是不执行内部public;当两个public类并列时,会报错,提醒与当前文件名不同的public类必须限定在它自己的文件中。java程序是从一个public类的main函数开始执行的,且一个public 类只能定义在以它的类名为文件名的文件中。 每个编译单元都只有一个public 类,因为每个编译单元都只能有一个公共接口,用public类来表现。该接口可以按照要求包含众多的支持包访问权限的类。如果有一个以上的public 类,编译器就会报错, 并且public类的名称必须与文件名相同(严格区分大小写)。 当然一个编译单元内也可以没有public类。在一个源文件即.java文件中可以有很多类,只有一个public类其他的都不能是,因为需要在public类中找程序的入口 main函数。

问题2:把main方法的返回值由void改为int,程序能编译通过吗?能运行吗?

不能,因为如果改为int,没有返回值,且加上return语句一样不能运行,会报错,提醒“必须返回当前文件public中的空类型值,请将main方法定义为:public static void main(String[] args)”。所以必须这么定义,这是Java的规范。因为对于java中的main方法,jvm有限制,不能有返回值,故返回值类型为void。

问题3:为什么java规定作为程序的入口点的main()方法是静态的?

非静态成员函数在执行前必须先构造并实例化该函数所在的类。如果允许非静态的main,那么main函数所在的类必须先进行实例化,,那么需要再写个函数去实例化main所在的类,再调用main,那这个实例化的代码又写在哪,如果它也是非静态的,又要写个函数去实例化它所在的类。因此java语言就规定了main必须是静态的。

 问题4:请看左边的示例代码,输出结果是什么?

 

输出结果:2

问题5:Java变量遵循“同名变量的屏蔽原则”,请课后阅读相关资料弄清楚相关知识,然后自己编写一些测试代码,就象本示例一样,有意识地在不同地方定义一些同名变量,看看输出的到底是哪个值?

测试代码:

 

运行结果:

结论:对于同名变量,若变量是在局部内定义并使用,那么将屏蔽全局变量而使用局部变量的值;若变量是在全局定义并使用,那么将屏蔽局部变量,而使用全局变量的值。

问题6:看着这个图,再查查Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?

 

byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
int:32位,最大数据存储容量是2^32-1,数据范围是-2^31~2^31-1。
long:64位,最大数据存储容量是2^64-1,数据范围为-2^63次~2^63-1。
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值。

结论:低位向高位转换是自动转换,无精度损失。高位向低位转换是强制转换,有精度损失。

问题7:为什么double类型的数值进行运算得不到“数学上精确”的结果?

结果与浮点数在计算机内部的表示方法有关系,这种方法问题在于如何在二进制中保存小数点的问题,即利用科学计数法,这样来保证小数点在第一个位置。由于计算机只能处理0和1,所以在计算机里面表示浮点数的时候,科学计数法中的基数是2,而不是10。所以说计算机里面浮点数都是近似值,而不是确切的值。计算机得出的的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit。后面舍去的位数一定会带来误差,因此无法得到“数学上精确”的结果。

问题8:在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。为什么会这样呢?

 

duoble并不能准确的表示BigDecimal 16位有效数字以上的数字。而BigDecimal所创建的对象不能使用+-*/等传统的算术运算符直接对其对象进行数学运算,必须调用相应的方法。因为方法中的参数必须是BigDecimal的对象,所以定义时应为字符串。

问题9:以下代码的输出结果是什么?

              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

对于在System.out.println()语句中的+,如果+的前面是字符串,如“X+Y”就是个字符串,在这种情况下,不管后面接的是什么类型,都默认是拼接字符串,而不会进行加法运算。

原文地址:https://www.cnblogs.com/iCheny/p/7633403.html