2017-05-04 90 views
1

以下系列的類和接口compil。但是這個代碼之後的下一個類沒有。錯誤+繼承+接口

public abstract class ClassA { 
    public void methodOne() { 
     System.out.println("Hello from methodOne."); 
    } 

    public int methodTwo(int a, int b) { 
     return a + b; 
    } 

    public abstract int methodThree(int a, int b); 
} 

public interface InterfaceA { 
    int methodOne(int a, int b); 
} 

public class ClassB extends ClassA { 
    public int methodOne(int a) { 
     return 5 * a; 
    } 

    public int methodTwo(int a, int b) { 
     return 2 * super.methodTwo(a, b); 
    } 

    public int methodThree(int a, int b) { 
     return a * b; 
    } 
} 

public class ClassC extends ClassB implements InterfaceA { 

    public int methodOne(int a, int b) { 
     return a % b; 
    } 

    public int methodThree(int a, int b) { 
    return a ‐ b; 
} 

    public void methodFour(int a) { 
     System.out.println("Here is number: " + a); 
    } 
} 

public class ClassD extends ClassC { 
    public void methodFour(int a, int b) { 
     System.out.println("Here is the sum: " + (a + b)); 
    } 

} 

下面的輸出在編譯過程中給出錯誤,但是爲什麼?此外,究竟是什麼意思時,例如,ClassA_Type bla = new ClassB()?

public class SomeClass { 
    public static void main(String[] args) { 

     ClassA oneA = new ClassB(); 
     System.out.println(oneA.methodOne(5)); 

     InterfaceA oneIA = new ClassD(); 
     oneIA.methodFour(6, 7); 


    } 
} 
+3

考慮添加確切的錯誤消息。 – Berger

+0

@Berger問題出現在過去的任務中,問題是要求聲明SomeClass的輸出,並在適當的地方寫入「error」。 – mathStudent1936

+1

「另外,究竟是什麼意思,例如,ClassA_Type bla = new ClassB()?」 < - 雖然A類在你的案例中是抽象的,而不是一個接口,但無論如何,這應該解釋它(相同的原則):[「編程接口」是什麼意思?](http://stackoverflow.com/questions/ 383947 /它是什麼意思程序到界面) –

回答

2
ClassA twoA = new ClassA(); 

你不能這樣做,因爲ClassA的是抽象的,這意味着只有子類可以的實例,例如

ClassA twoA = new ClassB(); 
+0

也沒有'oneC' ORV,它也會導致編譯錯誤。 – hagrawal

2

有看一下oracle文檔頁面abstract classesoverriding

一個抽象類是ac那些被聲明爲抽象的 - 它可能包含也可能不包含抽象方法。抽象類不能被實例化,但它們可以被分類。

由於上述原因,下面語句拋出編譯錯誤(因爲ClassA是抽象類,不能被實例化)

ClassA twoA = new ClassA(); 

關於你的

查詢此外,究竟是什麼它是否意味着,例如,ClassA_Type bla = new ClassB()?

這意味着具體類ClassBClassA的子類已創建。

當抽象類是子類時,子類通常爲其父類中的所有抽象方法提供實現。在這種情況下,抽象方法methodThree已在ClassB中實施。

使用

ClassA_Type bla = new ClassB() 

,而不是

ClassB_Type bla = new ClassB() 

的優點是:

在未來,如果ClassC擴展ClassA的,你可以簡單地改變

ClassA_Type bla = new ClassC() 

的基地ss可以用任何具體實現來實例化

+0

謝謝!另外,如果bla是ClassA_Type或InterfaceA_Type,那麼這是什麼意思/究竟是基於類類型綁定的? – mathStudent1936

+1

如果ClassC擴展ClassB實現InterfaceA,那麼Class C可以是1)ClassB類型2)Class A類型(因爲Class B擴展了Class A)3)InterfaceA類型 –

0

oneIA.methodFour(6, 7);將不會編譯,因爲InterfaceA沒有方法methodFour。編譯器只能識別變量聲明類型的成員。

您詢問的任務是「擴展轉換」的一個示例,JLS詳細解釋了這種轉換。在那裏閱讀。