动手动脑及课后实验整理集合

一个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"。

 

posted @ 2017-10-05 01:37  messi2017  阅读(136)  评论(0编辑  收藏  举报