抽象方法的不寻常行为

问题描述:

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

首先,我创建了一个名为可打印的接口,并在文件中保存Printable.java它:

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

然后我创建了两个类ClassA和ClassB的实现打印如下:

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,我编译类,如下所示:

[email protected]:~/java/upload$ ls 
ClassA.java ClassB.java Printable.java Test.java 
[email protected]:~/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 
[email protected]:~/java/upload$ 

所以我想在打印发表评论的方法显示()的声明,我这样做,并保存文件如下:

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

和现在重新编译的错误都不见了,输出率为:

[email protected]:~/java/upload$ javac Test.java 
[email protected]:~/java/upload$ ls 
ClassA.class ClassA.java ClassB.class ClassB.java Printable.class Printable.java Test.class Test.java 
[email protected]:~/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 
[email protected]:~/java/upload$ 

这是一切ok到此级别,但现在我决定取消演出()的声明中打印的注释,保存它如下:

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

现在我重新编译它,并希望再次得到错误,但这次重新编译的javac没有给任何错误,但它应该得到的,因为不给执行的方法显示错误() 。它编译全成如下:

[email protected]:~/java/upload$ ls 
ClassA.class ClassA.java ClassB.class ClassB.java Printable.class Printable.java Test.class Test.java 
[email protected]:~/java/upload$ javac Test.java 
[email protected]:~/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 
[email protected]:~/java/upload$ 

我无法理解为什么编译器没有再次给了错误,我没有任何改变我做了后保存每个文件。请帮忙,并抱歉有任何错误。

+0

在你运行之前重新编译所有的类,我建议你开始使用编辑器,这样你就不会在不知不觉中犯这些错误。 – karthikdivi

+0

你真的需要学习如何使用像'Maven'或'Gradle'这样的构建系统。 –

您每次只能重新编译Test.java。如果您尝试重新编译的所有内容,您将再次看到该错误。

老实说,我不记得如何javac工程以重新编译一下细节 - 无论是检查源代码对类文件的时间戳,或有无类文件,不是源文件以外,是否只编译代码你指定。我不会去查看它,因为我不认为依赖它是个好主意:每次只重新编译一次。