2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Java】継承とインターフェース実装を同時に行った場合のメソッド呼び出しのエラー

Posted at

Java研修中に起こったエラーについての覚え書き。

#コードおよびコンパイルエラー

Sample.java
abstract class A{
    abstract void aMethod();
} 

interface B{
    void bMethod();
}

//A継承
class OnlyA extends A{
    public void aMethod(){};
}

//A継承・B実装
class AB extends A implements B{
    public void aMethod(){};
    
    public void bMethod(){};
}

public class Main {
    public static void main(String[] args){
        A[] a = new A[]{new OnlyA(), new AB()};

        //抽象クラスメソッド呼び出し
        a[0].aMethod();
        a[1].aMethod();

        //インターフェースメソッド呼び出し
        a[1].bMethod();
    }
}

/*
Main.java:26: error: cannot find symbol
        a[1].bMethod();
            ^
  symbol:   method bMethod()
  location: class A
*/

呼び出せませんでした。

#解決法

Main.java
public class Main {
    public static void main(String[] args){
        A var1  = new AB();
        B var2  = new AB();
        AB var3 = new AB();
        
        var1.bMethod(); //これはダメ
        var2.bMethod(); //これはオッケー
        var3.bMethod(); //これもオッケー
    }
}

この場合、インターフェース型で宣言するかそれを実装した型で宣言しないとダメみたいですね。

インスタンスclass AB extends A implements Bのメソッドに直接アクセスしてるもんだと思ってたけどclass Aで宣言してるからまずそっちにアクセスしてるのかな?

継承だけ・実装だけの場合、親子両方定義するのでcannot find symbolが出ることはまあないんですが、このように継承と実装を同時に行うと注意しないといけないですね。
(あまりインターフェースを使ったことがないのがバレる形になった)

もっと勉強が必要と感じた次第です。

2
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?