簡體   English   中英

抽象方法的異常行為

[英]Unusual Behavior of Abstract Method

我是Java初學者,我正在學習使用接口。 據我了解,實現接口的類如果是具體的類,則必須給出其抽象方法的定義。 但是我確實按照步驟進行操作,並且錯誤地得到了一種非常不尋常的行為,以下是我所做的事情。

首先,我創建了一個名為Printable的接口,並將其保存在文件Printable.java中:

public interface Printable{
    public void print();
    public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}

然后,我創建了兩個類ClassA和ClassB,它們實現了Printable,如下所示:

ClassA的:

public class ClassA implements Printable{
    public ClassA(){
        System.out.println("object of class A is created");
    }
    public void print(){
        System.out.println("print called from class A");
    }
}

B類:

public class ClassB implements Printable{
    public ClassB(){
        System.out.println("Object of class B is created");
    }
    public void print(){
        System.out.println("print called from class B");
    }
}

我創建了一個名為Test的測試類,如下所示:

public class Test{
    public static void main(String args[]){
        ClassA a1 = new ClassA();
        a1.print();
        ClassB b1 = new ClassB();
        b1.print();
        a1.defaultMethod();
    }
}

我知道在編譯上述類時會出錯,因為我故意沒有在類A和B中給出接口Printable的抽象方法show()的定義,因此我按如下方式編譯該類:

harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.java  ClassB.java  Printable.java  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
./ClassA.java:1: error: ClassA is not abstract and does not override abstract method show() in Printable
public class ClassA implements Printable{
       ^
./ClassB.java:1: error: ClassB is not abstract and does not override abstract method show() in Printable
public class ClassB implements Printable{
       ^
2 errors
harsh@harsh-Inspiron-3558:~/java/upload$ 

所以我想在Printable中注釋方法show()的聲明,然后這樣做並保存文件,如下所示:

public interface Printable{
    public void print();
    //public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}

現在重新編譯錯誤消失了,輸出如下:

harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$

到這里都可以,但是現在我決定在Printable中刪除show()聲明的注釋並將其保存如下:

public interface Printable{
    public void print();
    public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}

現在,我重新編譯它並希望再次得到錯誤,但是這次重新編譯時,javac沒有給出任何錯誤,但是由於沒有給出方法show()的實現,因此應該給出錯誤。 編譯成功如下:

harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$ 

我不明白為什么編譯器沒有再給出錯誤,我做了任何修改后都保存了每個文件。 請幫助,對於任何錯誤,我們深表歉意。

每次只重新編譯Test.java 如果您嘗試重新編譯所有內容 ,則會再次看到該錯誤。

老實說,我不記得怎么細節javac工程以重新編譯的東西-無論是檢查源代碼對類文件的時間戳,或者是否只編譯代碼在沒有類文件,超過您指定的源文件等。 我不會去查找它,因為依賴它不是一個好主意:每次都重新編譯所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM