java - 抽象方法的异常行为

标签 java interface javac

我是一名java初学者,我正在学习使用接口(interface)。据我所知,如果实现接口(interface)的类是具体类,则必须给出其抽象方法的定义。但我按照步骤做了,但错误地得到了一个非常不寻常的行为。以下是我所做的。

首先,我创建了一个名为 Printable 的接口(interface)并将其保存在文件 Printable.java 中:

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

然后我创建了两个实现 Printable 的类 ClassA 和 ClassB,如下所示:

A类:

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 中给出接口(interface) 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 的详细信息了。确定要重新编译的内容 - 是否检查源文件与类文件时间戳,或者是否仅编译除您指定的源文件之外没有类文件的代码。我不会查找它,因为我认为依赖它不是一个好主意:每次都重新编译所有内容。

关于java - 抽象方法的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46220947/

相关文章:

java - 使用 ant : How to add external library files to the executable jar 创建可执行 jar

java - 为什么 ant 中的 javac 使用不兼容的类型构建脚本错误

具有静态属性或方法的 C# 接口(interface)?

java - 如何在 Windows 中更改默认系统 java 编码形式?

java - 在java中用单独的矩形渲染等轴测图

java - Java中CharSequence和String之间的确切区别

java - 泛型问题

c# - 如何强制继承类在 C# 中实现静态方法?

java - 为什么这段代码可以用 jdk8u45 及更高版本编译,但不能用 jdk8u25 编译?

java - JCreator IDE : Program will compile but not run, 在命令提示符下工作