繁体   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