2017-09-14 4 views
0

私はJavaの初心者です。私はインターフェイスを使用することを学んでいました。インタフェースを実装するクラスは、抽象メソッドが具体的なクラスである場合、その抽象メソッドの定義を与えなければならないことを私は知っています。しかし、私は踏みとどまりました。誤って、私は本当に異常な行動を起こしました。抽象メソッドの異常な振る舞い

にClassA:

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

は、その後、私は次のように印刷可能を実装する2つのクラスにClassAとClassBのを作成しました:

は、まず私は印刷可能という名前のインターフェイスを作成し、ファイルPrintable.javaでそれを保存しました

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"); 
    } 
} 
インターフェース印刷用の

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

私は意図的に抽象メソッドショー(の定義を与えていないので、上記のクラスをコンパイルするには、私はエラーを取得することを知っていた)で:

次のように私はテストという名前のテストクラスを作成しましたclassessの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'のようなビルドシステムを使う方法を学ぶ必要があります。 –

答えて

3

毎回Test.javaをリコンパイルするだけです。 すべてを再コンパイルしようとすると、エラーが再び表示されます。それは、クラスファイルのタイムスタンプ対ソースをチェックするかどうか、または、ソースファイル以外のクラスファイルがされていないところ、それが唯一のコードをコンパイルするかどうか -

私は正直javacを再コンパイルするかをどのように機能するかについての詳細は覚えていませんあなたが指定します。私はそれを参照するつもりはありません。なぜなら、それに依存することは良い考えではないと思うからです。たびにすべてを再コンパイルするだけです。

関連する問題