Code Fix

上級

is not abstract and does not override の原因と直し方

抽象メソッドの実装漏れ。extendsとimplementsの使い分け、可視性の制約も扱います。

エラーメッセージの読み方

Main.java:4: error: Main is not abstract and does not override abstract method area() in Shape
Main.java
ファイル名
4
行番号 — javacが異常に気づいた位置。原因の行とは限りません
error
種別 — コンパイルエラー。実行まで到達しません
Main is not abstract and does not override abstract method area() in Shape
内容 — javacが期待していたもの、または見つけられなかったもの

このエラーが出る典型パターン

パターン1

 1  abstract class Shape {
 2      abstract double area();
 3  }
 4  public class Main extends Shape {
 5                                   
                      ^
 6      public static void main(String[] args) {
 7          System.out.println(new Main().area());
 8      }
 9  }
Main.java:4: error: Main is not abstract and does not override abstract method area() in Shape

抽象メソッドは具象クラスで必ず実装します。実装しないならクラス自体もabstractにします。

直し方: (空)double area() { return 1.0; } にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  interface Greeter {
 2      void greet();
 3  }
 4  public class Main extends    Greeter {
                           ^
 5      public void greet() { System.out.println("hi"); }
 6      public static void main(String[] args) {
 7          new Main().greet();
 8      }
 9  }
Main.java:4: error: no interface expected here

クラスの継承はextends、インターフェースの実装はimplementsです。多重に実装できるのは後者だけです。

直し方: extendsimplements にします。

この問題を解いてみる →

パターン3

 1  interface Greeter {
 2      void greet();
 3  }
 4  public class Main implements Greeter {
 5                void greet() { System.out.println("hi"); }
            ^
 6      public static void main(String[] args) {
 7          new Main().greet();
 8      }
 9  }
Main.java:5: error: greet() in Main cannot implement greet() in Greeter attempting to assign weaker access privileges; was public

インターフェースのメソッドは暗黙にpublicです。実装側でpublicを省くとパッケージ内限定になり狭まります。

直し方: (空)public にします。

この問題を解いてみる →

よくある誤解

エラーは実装が漏れているクラス側に出ます。抽象メソッドを追加した親クラス側ではありません。

まとめ

is not abstract and does not overrideは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)