質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

3316閲覧

抽象メソッドは本文を指定しませんというエラー文を解決したい。

SPK

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/06/02 14:35

編集2019/06/03 14:09
``` コード ```### 前提・実現したいこと 参考書(*1)の練習問題を解こうとしています。 問題は、「次のコードに含まれる2つのメソッドを関数として変数に格納し、呼び出すプログラム(クラス名:Main)を作成してください。」というものです。 isOddメソッドとaddNamePrefixメソッドのためのインターフェースを作成しましたが、addNamePrefixメソッドで「抽象メソッドは本文を指定しません。」というエラー文が発生します。 addNamePrefixメソッドをstaticメソッドにすると解決することはわかりました。 しかし、なぜStaticをつける必要があるのかがわかりません。 どなたかご教授お願いします。 ```ここに言語名を入力 public interface FuncList{ public static boolean isOdd( int x ) { return ( x % 2 == 1 ); } public String addNamePrefix( boolean male, String name ) { if( male == true ) { return "Mr." + name; } else { return "Ms." + name; } } } interface Func1{ boolean call{ int x }; } interface Func2{ String call (boolean male, String name); } public class Main{ public static void main ( String[] args ){ FuncList funclist = new FuncList(); Func1 f1 = FuncList::isOdd; Func2 f2 = funclist:: addNamePrefix; } } ``` ### 試したこと ### 補足情報(FW/ツールのバージョンなど) (*1)スッキリわかるJava入門 実践編第2版 スッキリわかるシリーズ P.193

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/02 23:47

コードはマークダウンのcode機能を利用してご提示ください
quickquip

2019/06/03 03:27 編集

staticがついているメソッドと、ついていないメソッドとで、関数オブジェクトを参照する時の書き方が**違う**ことが「分かりましたか?」という確認と「それぞれの書き方を練習しましょう」という問題です。 適当に同じように書いたらダメだったからstaticを付けてみた、では意味がありません。 問題の意図を無視してaddNamePrefixをstaticにしたら練習問題になりませんし、本を参照できる人以外が問題の意図をわかるためには問題文を正確に引用するべきです。 (そもそもFuncListを**修正する問題ではない**ですよね?)
javahack

2019/06/03 15:35

問題が「次のコードに含まれる2つのメソッドを関数として変数に格納し、呼び出すプログラム(クラス名:Main)を作成してください。」ならば、interafaceを定義する必要はありません。むしろ使うべきではないです。 もし、実際の問題に上記以外の記述が含まれているのなら全文を追記してください。
guest

回答1

0

インターフェースはメソッドの定義だけを書くもので、その実装を含んではいけないのです。
ただしJava8以降ならデフォルトメソッド指定すれば可能です。

そもそもFuncListはただのクラスで良いし、メソッドもstaticで良いと思います。
インターフェースの出番には思えません。

質問編集を受けて

addNamePrefixメソッドをstaticメソッドにすると解決することはわかりました。 しかし、なぜStaticをつける必要があるのかがわかりません。

端的な回答
インターフェースにstaticメソッドを置くのが、Java8の仕様で認められたからです。

踏み入った回答
staticメソッドのレシーバはコンパイル時に解決され、ポリモーフィズムを阻害しないからです。

投稿2019/06/02 14:45

編集2019/06/03 14:59
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問