2016-08-03 6 views
1

オブジェクトのメソッドを追加したり、このように抽象メソッドをオーバーライドすることはできますが、エラーが発生することがあります。これが可能なのか、私が間違っているのか教えていただけますか?javaのメソッドの追加時にエラーが発生する

public abstract class Pesti { 
    public abstract void ud(); 
} 

public class EX2 { 
    public static void main(String[] args) { 
     Pesti p = new Pesti() { 
      public void ud() { 
       System.out.println("Pestele este ud!"); 
      } 

      public void inn() { 
       System.out.println("Innoata!"); 
      } 
     }; 
     p.ud(); 
     p.inn(); 
    } 
} 

これは、方法innが見つかりません。

答えて

6

あなたのしていることは、Pestiの匿名サブクラスを作成することです。ただし、p変数のタイプはPestiなので、Pestiクラス(またはそのスーパークラスのいずれか)で宣言されたメソッドのみを呼び出すことができます。したがって、ud()には電話できますが、inn()には電話できません。

pをサブクラスの型にキャストできたら、inn()を呼び出すことができましたが、これは匿名サブクラスインスタンスであるため、その型にキャストできません。

Pestiには、inn()を抽象的な(または具体的な)方法として宣言できます。その後、コードがコンパイルをパスし、匿名サブクラスインスタンスでこのメソッドの実装が実行されます。

public abstract class Pesti { 
    public abstract void ud(); 
    public abstract void inn(); 
} 
-1

は、あなたがこのlinkを見てする必要があると思う、私はあなたが何をしたいかのか分からないが、あなたは、抽象クラスをインスタンス化することはできません、あなたは私のリンクで詳細な説明を見つけることができ、それがいただければ幸いです助けてください

+1

このリンクは質問に答えるかもしれないが、ここでは答えの重要な部分が含まれており、参考のためにリンクを提供することをお勧めします。リンクされたページが変更された場合、リンクのみの回答は無効になります。また、ユーザは 'abstract'クラスをインスタンス化しようとしているのではなく、インスタンスである[匿名クラス(https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)を作成しています「ペスティ」の – bcsb1001

1

Pestiのインスタンスとしてpを宣言しましたが、Pestiで定義されていない方法を使用しようとしました。オブジェクトを抽象クラスとして宣言する場合、このクラスで定義されたメソッドのみを使用できます。 inn()メソッドを使用するには、このメソッドをPestiクラスで宣言する必要があります。あるいはPestiを継承したクラスを作成してinn()メソッドを実装し、そのオブジェクトを拡張クラスとして宣言することもできます。

0

Pestiは、ちょうど1つの方法(abstract)を持つabstractクラスです:ud()です。そのため、タイプPestiで宣言された変数は、ud()またはクラスObjectPestiの暗黙のスーパークラス)からの任意のメソッドを呼び出すためにのみ使用できます。 pがこの型で宣言されているので、実際にはinn()というメソッドののインスタンスであるにもかかわらず、という変数を持つコンテキストではこのメソッドは使用できません。タイプPestiです。

おそらく、あなたはので、すべてのインスタンスがそれを実装する必要がありPestiinn()メソッドを追加することを目的:

public abstract class Pesti { 
    public abstract void ud(); 
    public abstract void inn(); 
} 

それとも、あなたが本当にすべてで匿名クラスを使用したいとPestiのサブクラスを作成する必要はありません利用可能inn()方法で:

public class PestiImpl extends Pesti { 
    @Override 
    public void ud() { 
     System.out.println("Pestele este ud!"); 
    } 

    public void inn() { 
     System.out.println("Innoata!"); 
    } 
} 

は(または次の2つの間の継承の層を持つことができ、いくつかのabstractクラスはを拡張しますとinn()abstractメソッドとして宣言しました。inn()メソッドでこのような他のクラスがありますが、Pestiではありません。

サイドノート:コードを読みやすくし、メソッドをオーバーライドしようとするときにタイプミスなどのミスを避けるために、適切な場合は@Override注釈を使用することを強くおすすめします。ほとんどのIDEに自動的に挿入することができます。

関連する問題