zoukankan      html  css  js  c++  java
  • 动手动脑及课后实验整理集合

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

  • 相关阅读:
    HDU 5213 分块 容斥
    HDU 2298 三分
    HDU 5144 三分
    HDU 5145 分块 莫队
    HDU 3938 并查集
    HDU 3926 并查集 图同构简单判断 STL
    POJ 2431 优先队列
    HDU 1811 拓扑排序 并查集
    HDU 2685 GCD推导
    HDU 4496 并查集 逆向思维
  • 原文地址:https://www.cnblogs.com/messi2017/p/7628118.html
Copyright © 2011-2022 走看看