Given:



package p1;

public interface DoInterface {

    void method1(int n1); // line n1
}
package p3;

import p1.DoInterface;

class DoClass implements DoInterface {

    public DoClass(int p1) {
    }

    public void method1(int p1) {} // line n2

    private void method2(int p1) {} // line n3
}

public class Test {

    public static void main(String[] args) {
        DoClass doi = new DoClass(100); // line n4
        doi.method1(100);
        doi.method2(100);
    }
}

Which change will enable the code to compile?

A. Adding the public modifier to the declaration of method1 at line n1
B. Removing the public modifier from the definition of method1 at line n2
C. Changing the private modifier on the declaration of method 2 public at line n3
D. Changing the line n4 DoClass doi = new DoClass();

題解

題目原先提供的程式會編譯錯誤,因為DoClass類別的method2方法使用了private修飾字來修飾,是私有成員,只有在DoClass類別內才可以存取。因此Test類別的main方法若要存取DoClass類別物件的method2方法會發生編譯錯誤。

選項A,介面(interface)定義的方法會自動以public修飾字來修飾,因此在line n1加上public修飾的結果和沒加public修飾的結果是一樣的。

選項B,移除line n2的public修飾字並不能改變method2只能在DoClass類別使用的情形。

選項C,使用public來修飾method2方法,讓它可以在DoClass類別之外被使用,為正確答案。

選項D,DoClass類別並沒有無參數的建構子,這樣修改反而會造成更多的編譯問題。