システムアーキテクト 2019年 午前2 問04
問題文
javaサーブレットを用いたWebアプリケーションソフトウェアの開発では、例えば、doGetやdoPostなどのメソッドを、シグネチャ(メソッド名、引数の型と個数)は変えずに、目的とする機能を実現するための処理に置き換える。このメソッドの置き換えを何と呼ぶか。
選択肢
ア:オーバーライド(正解)
イ:オーバーロード
ウ:カプセル化
エ:継承
🔒 解説は解答すると表示されます
メソッドのオーバーライド【午前2解説】
正解の理由
サーブレット開発で「doGetやdoPostなどのメソッドを、シグネチャ(メソッド名・引数の型と個数)は変えずに処理を置き換える」という説明は、スーパークラス(HttpServletなど)に定義されたメソッドをサブクラスで同一署名のまま実装し直すことを指します。これはオブジェクト指向で「スーパークラスの振る舞いをサブクラスで上書きする」操作であり、選択肢の中では ア(オーバーライド)が該当します。実装時にはメソッド名・引数・戻り値の互換性を保ち、必要であれば @Override アノテーションを付けるのが一般的です。
解法ステップ
- 問題文からキーワード抽出:「シグネチャは変えずに」「置き換える」「doGet/doPost」など。
- キーワードと用語対応:
- 同じ名前・同じ引数で実装を置き換える → オーバーライド(Override)
- 同じ名前で引数が異なる複数のメソッドを持つ → オーバーロード(Overload)
- 選択肢を照合して最も適合する語を選ぶ(ここでは ア)。
選択肢別の誤答解説
- ア(オーバーライド)
正しい。スーパークラスのメソッド定義をサブクラスで同一シグネチャのまま再定義して振る舞いを置き換える行為を指す。 - イ(オーバーロード)
誤り。オーバーロードは同じメソッド名でパラメータの型や数を変え、複数のバリエーションを定義することであり、シグネチャを変えずに「置き換える」動作とは異なる。 - ウ(カプセル化)
誤り。カプセル化はデータと実装の隠蔽(アクセス制御)を指す概念で、メソッドの置き換えそのものを意味しない。 - エ(継承)
誤り(関連はあるが不正解)。オーバーライドは継承関係のもとで行われる操作であり、「継承」はサブクラスがスーパークラスの特性を受け継ぐこと自体を指す。問題の問意は「置き換えの操作名」なので継承そのものではない。
よくある誤解
- オーバーロードとオーバーライドを混同する
名前が似ているため、引数を変えて複数定義する(オーバーロード)と、スーパークラスの実装を置き換える(オーバーライド)を取り違えやすいです。設問の「シグネチャは変えずに」という表現がオーバーライドの決め手です。 - static メソッドや final メソッドはオーバーライドできない
static はメソッド隠蔽(hiding)になり、final メソッドはサブクラスで上書きできません。通常のインスタンスメソッドである doGet/doPost はオーバーライド対象ですが、宣言に注意が必要です。 - アクセス修飾子や戻り値の違いの扱い
オーバーライド時はアクセスレベルを狭めてはいけません(拡げることは可)。戻り値は共変戻り値(サブクラス型に変更)を除き同一か互換でなければなりません。
補足コラム
実際のサーブレットでは、HttpServlet のメソッドをオーバーライドしてリクエストを処理します。例として doGet をオーバーライドするコード例を示します。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/plain; charset=UTF-8");
resp.getWriter().write("Hello, world!");
}
}
この例ではシグネチャを変えずに処理を置き換えており、まさにオーバーライドの典型例です。
FAQ
Q1: オーバーライドとオーバーロードの見分け方は?
A1: 「シグネチャ(メソッド名+引数の型と個数)が同一で実装を置き換える」→オーバーライド。「メソッド名は同じだが引数の型や個数が異なる複数のメソッドを定義する」→オーバーロード。
A1: 「シグネチャ(メソッド名+引数の型と個数)が同一で実装を置き換える」→オーバーライド。「メソッド名は同じだが引数の型や個数が異なる複数のメソッドを定義する」→オーバーロード。
Q2: HttpServlet のデフォルト実装で doGet/doPost をオーバーライドしなければどうなる?
A2: javax.servlet.http.HttpServlet のデフォルト実装では、サポートしていない HTTP メソッドに対しては HTTP 405(Method Not Allowed)などのエラー応答を返す仕様になっています。したがって、GET リクエストに対して適切な応答を返したい場合は doGet をオーバーライドして実装する必要があります(逆に意図的に GET をサポートしないならオーバーライドしなくても良い)。なお、doHead のデフォルト実装は通常 doGet を呼び出して本文を抑制する振る舞いをします。
A2: javax.servlet.http.HttpServlet のデフォルト実装では、サポートしていない HTTP メソッドに対しては HTTP 405(Method Not Allowed)などのエラー応答を返す仕様になっています。したがって、GET リクエストに対して適切な応答を返したい場合は doGet をオーバーライドして実装する必要があります(逆に意図的に GET をサポートしないならオーバーライドしなくても良い)。なお、doHead のデフォルト実装は通常 doGet を呼び出して本文を抑制する振る舞いをします。
Q3: static メソッドはオーバーライドできる?
A3: いいえ。static メソッドはクラスに紐づくためオーバーライドできず、サブクラスで同名の static メソッドを定義すると「隠蔽(hiding)」になります。
A3: いいえ。static メソッドはクラスに紐づくためオーバーライドできず、サブクラスで同名の static メソッドを定義すると「隠蔽(hiding)」になります。
関連キーワード: Java、サーブレット、オーバーライド、オーバーロード、継承、カプセル化、HttpServlet、doGet、doPost

\ せっかくなら /
システムアーキテクトを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

