[Java] 作业4答疑

写在最前面:

这些试题多是计算机学院的二三年级学生的Java课中的考试题目。

大家不会做很正常,不要紧张,尽量去理解即可。

期末考试的难度不会这么高,虽然我不清楚期末考试的题型。


Q15

Does the return statement in the following method cause compile errors? (代码中的return语句是否会造成编译错误?)

public static void main(String[] args) {
  int max = 0;
  if (max != 0)
    System.out.println(max);
  else
    return;
}
不会。因为main method的返回值是void, 所以程序理应返回一个空值(void)。


Q22

When you invoke a method with a parameter, the value of the argument is passed to the parameter. This is referred to as _________.

可以参考群共享里,《Java核心技术(基础篇)》第9版 -- 4.5 方法参数(第121页)


Q23

static void nPrint(String message, int n)接受两个参数:

    - String类型的参数

    - int类型的参数

如果我们调用nPrint('a', 4)将导致_____ 

建议在eclipse中去实验一下。


Q24

static void nPrint(String message, int n) {
  while (n > 0) {
    System.out.print(message);
    n --;
  }
}
以nPrint("A message", 2)为例,拿出纸笔演算(模拟)一下循环的过程就可以了,比如说:

    1. 第一次循环

        - 开始时,n = 2

        - 循环体中,打印消息,并且n --, 此时n = 1

    2. ....


Q25

Analyze the following code:

public class Test {
  public static void main(String[] args) {
    System.out.println(xMethod(5, 500L));
  }

  public static int xMethod(int n, long l) {
    System.out.println("int, long");
    return n;
  }

  public static long xMethod(long n, long l) {
    System.out.println("long, long");
    return n;
  }
}
我在stackoverflow上问了 这个问题,结果又因为duplicate question被扣了几分...

这题的解题关键是,根据3.10.1. Integer Literals:

    - An integer literal is of type long if it is suffixed with an ASCII letter L or l; 

    - otherwise it is of type int.

所以在main方法中,xMethod的第一个实参 5 的类型是int, 第二个实参 500L 的类型是long.

因此,将调用xMethod(int n, long l)这个方法。


Q26

Analyze the following code

class Test {
  public static void main(String[] args) {
    System.out.println(xmethod(5));
  }

  public static int xmethod(int n, long t) {
    System.out.println("int");
    return n;
  }

  public static long xmethod(long n) {
    System.out.println("long");
    return n;
  }
}

第6行先定义了一个xmethod; 第11行对其进行重载(overload).

此时程序支持对xmethod的两种调用方式:

    - 传入两个整型参数(int, long), 那么将调用接受两个参数的xmethod;

    - 传入一个整型参数(long), 那么将调用接受一个参数的xmethod.

根据 Q25, 我们知道第3行main method中的5的类型是int, 但xmethod的方法中,只有xmethod(long)是接受一个参数的,而恰好int可以隐式转换成更高精度的long, 所以这里的 5 被编译器转换成了 5L, 再传递给了xmethod(long).

仍不理解的同学可查阅《Java语言程序设计(基础篇)》或《Java核心技术》中,有关方法(具体来说,是方法重载)的内容.

    - 《Java核心技术 基础知识》第9版,4.6.1 重载


Q27

判断下述程序的行为:

public class Test {
  public static void main(String[] args) {
    System.out.println(max(1, 2));
  }

  public static double max(int num1, double num2) {
    System.out.println("max(int, double) is invoked");
    if (num1 > num2)
      return num1;
    else
      return num2;
  }

  public static double max(double num1, int num2) {
    System.out.println("max(double, int) is invoked");
    if (num1 > num2)
      return num1;
    else
      return num2;
  }
}
在Test类中,我们定义里两个max方法;

在main方法调用max(1, 2)时,我们注意到:

    - 编译器可以将1转换成double, 调用max(double, int)

    - 编译器可以将2转换成double, 调用max(int, double)

任何一种转换都是符合语言标准的,但当同时存在这两种合理转换时,编译器却将无法决定采用哪一种转换。


Q28

判断下述程序的行为:

public class Test {
  public static void main(String[] args) {
    System.out.println(m(2));
  }

  public static int m(int num) {
    return num;
  }

  public static void m(int num) {
    System.out.println(num);
  }
}
1. 知识讲解:方法的重载是只能通过不同的 方法签名方法签名包括 方法名参数列表)实现的,返回值 不属于方法签名的一部分。

2. 本题解析:本题中的两个m方法都拥有相同的参数列表(亦即接受一个int参数),编译器将认为这是对m方法的重定义(re-definition),会产生编译错误。

3. 参考文献:《Java核心技术 基础知识》第9版,4.6.1 重载,能理解书中的这一页,就可以理解什么是方法重载了。


Q32

感觉这题要求也偏高了。根据Oracle Java doc, Math.random()返回值的值域是 [0, 1), 亦即一个左闭右开区间。

你可能感兴趣的:([Java] 作业4答疑)