动手动脑以及课后实验问题

1 . 一个Java类文件中真的只能有一个公有类吗?

Java语言基础的ppt的例子中(如图)是允许的,编译没有错误,是因为InnerClass类是Test类的内部类。

 

通过百度百科,查找到内部类的特点:

  (1)内部类仍然是一个独立的类,在编译后内部类会被编译成独立的.class 文件,但是前面以外部类类名+$符号。
    2)内部类不能用普通的方式访问。内部类是外部类的一个成员,可以自由地访问类的成员变量,无论是否private的。
    3)内部类声明成静态的,就不能随便访问外部类的成员变量,仍然只能访问外部类的静态成员变量。

所以,内部类的定义是没有问题的,但是如果将InnerClass类拿到外面,就会提示错误:公用类型 InnerClass 必须在它自己的文件中定义

因此,Java源文件中直接定义的public类只能有一个,且该类名必须与源文件名一致。内部类可以理解为外部类的一个成员,成员可以用public修饰。

 


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

Java规定main方法必须严格按如下形式进行声明:public static void main( String args[] )

void表明其不回任何结果。

当改为int并添加返回值0时,运行结果显示错误,不能运行。

 

 

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

正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。如果main方法不声明为静态的,JVM就必须创建main类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法。

 

4.变量作用域:

运行下图的程序,结果截图:

 

类的变量作用域是整个类,函数的变量作用域是整个函数,如果在类中定义了一个变量,这个类的函数定义一个,默认使用函数中的变量。

 

5.查查Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?

int           32      4           -2,147,483,648 ~ 2,147,483,647
short       16      2           -32768 ~ 32678
long        64      8           -9,223,372,036,854,775,808~+9,223,372,036,854,775,807
float        32      4           -3,40292347E+38 ~ +3,40292347E+38
double    64      8           -1.79769313486231576E+308 ~ 1.79769313486231576E+308
char        16      2           -128~127
boolean   1      0.125     true/false
byte      
   8       1           -128 ~ 127

位数小的转化为位数大的,无精度的损失,位数大的转化为位数小的,有精度的损失,所以进行数据类型转化时,注意精度的变化。

 

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

double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差比如要用4bit来表示小数3.26,从高到低位依次对应2的1,0,-1,-2次幂,应当在二进制数11.01(对应十进制的3.25)和11.10(对应十进制的3.5)之间选择。简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。

 

 

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

示例代码:

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));
    }
}

结果截图:

在使用BigDecimal(double)构造器时,使用不恰当会出现精确的误差,二进制浮点数的局限性产生类型上述的问题

 8.以下代码的输出结果是什么?

    int X=100;

    int Y=200;

    System.out.println("X+Y="+X+Y);

    System.out.println(X+Y+"=X+Y");

结果截图:

 

 “+”号运算顺序为从左向右,当“+”连接两个操作数其中有一个是字符串时,“+”为字符串连接操作符。

 当“+”连接一个数值和一个字符串时,数值会自动转换为字符串进行连接。

 

 

 

 

posted @ 2017-10-06 22:10  聆韵  阅读(115)  评论(0编辑  收藏  举报