1. 程式人生 > >Java 習題6 參考答案及解析

Java 習題6 參考答案及解析

1.問答題

  1. 介面中能宣告變數嗎?
  2. 介面中能定義非抽象方法嗎?
  3. 什麼叫介面的回撥?
  4. 介面中的常量可以不指定初值嗎?
  5. 可以在介面中只宣告常量,不宣告抽象方法嗎?

問答題解析

  1. 不能。
  2. 不能。
  3. 可以把實現某一介面的類,所建立的物件的引用,賦給該介面宣告的介面變數中。那麼該介面變數就可以呼叫被類實現的介面中的方法。
  4. 不可以。
  5. 可以。
    介面中可以宣告常量、抽象方法以及預設方法和靜態方法(jdk1.8新增)

介面的語法規則
- 介面及介面成員預設的訪問許可權為:public 或友好
- 常量預設新增static final關鍵字
- 抽象方法預設新增abstract關鍵字
- 只有default方法及static方法可以新增方法體
- 實現介面的類如果不能實現所有介面中待重寫的方法,則必須設定為抽象類
- 介面可以實現多繼承,即一個子介面可以同時繼承多個父介面
- 一個類可以繼承自一個父類,同時實現多個介面
- 當一個類同時實現多介面,且其中同時具有相同方法時,實現類需要重寫該方法,否則會編譯報錯

2.選擇題

(1)下列哪個敘述是正確的?
A. 一個類最多可以實現兩個介面。
B. 如果一個抽象類實現某個介面,那麼它必須重寫介面中的全部方法。
C. 如果一個非抽象類實現某個介面,那麼它可以只重寫介面中的部分方法。
D.允許介面中只有一個抽象方法。

(2)下列介面中標註的(A、B、C、D)中,哪兩個是錯誤的?

Java
interface Takecare{
    protected void speakHello();//A
    public abstract static void cry();//B
    int f(); //C
    abstract
float g(); //D

(3)將下列(A、B、C、D)哪個程式碼替換下列程式中的【程式碼】不會導致編譯錯誤?
A.public int f(){return 100+M;}
B.int f(){return 100;}
C.public double f(){return 2.6;}
D.public abstract int f();

Java
interface Com{
    int M = 200;
    int f();
}
class ImpCom implements Com{
    【程式碼】
}

2.選擇題解析

1.D
一個類可以實現多個介面,但是隻能繼承一個父類。
非抽象類實現介面必須要重寫介面中的全部方法,否則要把該類設定為抽象類,換句話說抽象類實現一個介面是可以不用重寫介面中的全部方法的。

2.AB
A中抽象方法的訪問修飾符只能用public。
B中abstract和static不能共存。

3.A
介面中的抽象方法預設是public類,那麼類在重寫介面方法時不僅要去掉abstract修飾符,給出方法體,而且方法的訪問許可權一定要明顯地用public來修飾(不能降低訪問許可權)。
C選項改變了返回值型別,不屬於方法重寫。

3.閱讀程式

(1)請說出E類中【程式碼1】和【程式碼2】的輸出結果

Java
interface A{
   double f(double x,double y);
}
class B implements A{
    public double f(double x,double y){
        return x*y;
    }
    int g(int a,int b){
        return a+b;
    }
}
public class E{
public static void main(String args[]){
    A a = new B();
    System.out.println(a.f(3,5));//【程式碼1】
    B b = (B)a;
    System.out.println(b.g(3,5));//【程式碼2】
    }
   }

(2)請說出E類中【程式碼1】和【程式碼2】的輸出結果。

Java
interface Com{
    int add(int a,int b);
}
abstract class A{
    abstract int add(int a,int b);
}
class B extends A implements Com{
    public int add(int a,int b){
        return a+b;
    }
}
public class E{
public static void main(String args[]){
    B b = new B()
    Com com = b;
    System.out.println(com.add(12,6));//【程式碼1】
    A a = b;
    System.out.println(a.add(10,5));//【程式碼2】
     }
  }

閱讀程式解析

1.【程式碼1】:15.0 【程式碼2】:8
B類實現了A介面,並重寫A中的方法。A a = new B()是介面回撥(可以把實現某一介面的類,所建立的物件的引用,賦給該介面宣告的介面變數中。那麼該介面變數就可以呼叫被類實現的介面中的方法。)所以用介面變數a呼叫B類中的f方法。返回15.0 。
B b = (B)a將a物件強制轉換為B類的物件,可以呼叫B類中的g方法返回8

2.【程式碼1】:18【程式碼2】:15
B類繼承了A類並實現了Com介面,Com com = b是介面回撥,所以com可以呼叫B類中的add方法輸出18,A a = b是上轉型(子類引用賦值給父類物件),那麼a也可以呼叫子類重寫父類的方法add,輸出15.

程式設計題

該題目和第5章習題5的程式設計題類似,只不過這裡要求使用介面而已。
設計一個動物聲音“模擬器”,希望模擬器可以模擬許多動物的叫聲,要求如下。

編寫介面Animal
Animal介面有兩個抽象方法cry()和getAnimalName(),即要求實現該介面的各種具體的動物類給出自己的叫聲和種類名稱。

編寫模擬器類Simulator
該類有一個playSound(Animal animal)方法,該方法的引數是Animal型別,即引數animal可以呼叫實現Animal介面類重寫的cry()方法播放具體動物的聲音,呼叫重寫的getAnimalName()方法顯示動物種類的名稱。

編寫實現Anima介面l的Dog類和Cat類
編寫主類Application(使用者程式)
在主類Application的main方法中至少包含如下程式碼:

Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());

程式設計題解析

Java
Animal.java
public interface Animal{
    public abstract void cry();
    public abstract String getAnimalName();
}

Simulator.java
public class Simulator{
    public void playSound(Animal animal){
    System.out.print("現在播放"+animal.getAnimalName()+"類的聲音:");
    animal.cry();
    }
}

Dog.java
public class Dog implements Animal{
    public void cry(){
        System.out.println("汪汪...汪汪");
    }
    public String getAnimalName(){
        return "狗";
    }
}

Cat.java
public class Cat implements Animal{
    public void cry(){
        System.out.println("喵喵...喵喵");
    }
    public String getAnimalName(){
        return "貓";
    }
}

Application.java
public class E{
public static void main(String args[]){
    Simulator simulator = new Simulator();
    simulator.playSound(new Dog());
    simulator.playSound(new Cat());
    }
   }