[英]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.