动手动脑及课后实验整理集合
一个Java类文件中真的只能有一个公有类吗?
不一定,Java类文件中直接定义的用public修饰符修饰的类确实只能有一个。但是,内部类作为一个类的内部成员,可以使用public修饰符进行修饰。如:
1 public class Test{ 2 public static void main(String[]args){ 3 } 4 public class InnerClass{ 5 } 6 }
这段代码是没有问题的。
main方法的返回值能不能由void改为int?
不能运行,这是Java语法规定,这么写便于JVM识别调用。
为什么Java规定作为程序入口点的main方法为静态的?
首先这是Java语法规定,严格记住就好。强行解释是好处很简单,不需要定义具体对象就可使用。不过c语言中也没有作特殊操作,Java里面main方法同样不需要显式调用。所以在我看来这是个拿结果当原因的问题,这就是为了配合jvm的运行才刻意为之。
变量作用域的测试
public class Test{ private static int value =1; public static void main(String[]args){ int value = 2; System.out.println(value); } }
这里和C语法一样,方法内重名的局部变量可以屏蔽类属性。故程序输出2。
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)); } }
输出结果显示是有误差的:
原因是计算机只能识别二进制,因此所有的数值都要转换为二进制再处理。可是熟悉进制转换就可以知道,浮点数的转换非常容易出现精度缺失,因此产生奇葩结果并不奇怪。事实上,浮点数并不适合精确计算,适合科学计算。
再看一个例子:
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)); } }
再次有奇葩结果输出:
Java提供的BigDecmial类具有两种构造方法。一种是以double为参数,一种是以string为参数。而对double类型的四舍五入的计算和进制转换过程仍会产生精度缺失,计算机在运行程序时并不像我们这样直接计算。还是鼓励使用以String为基型来构造一个BigDecmial的实例对象。
最后再来一个结束这次的总结:
public class Test { public static void main(String[] args) { int X=100; int Y=200; System.out.println("X+Y="+X+Y); System.out.println(X+Y+"=X+Y"); } }
输出结果为:
这样输入其实就是个操作符执行顺序的问题。第一句输出先输出字符串,Java语法规定字符串后与整形相加,整形数值会自动隐式转换为String类型,因此第一次会直接输出100200。
第二次+先对两个整形操作,自然会计算结果再输出,然后在输出"=x+y"。