ProgrammingJava開発者

Javaで使用されるOOPの主な原則とそれが実際にどのように実現されるかについて説明してください。

Hintsage AIアシスタントで面接を突破

回答。

Javaでは、オブジェクト指向プログラミング(OOP)の4つの重要な原則がすべて実装されています:カプセル化継承多態性抽象化

  • カプセル化は、クラスの内部実装を隠し、メソッドを通じてのみデータへのアクセスを提供します。Javaでは、アクセス修飾子(privateprotectedpublic)とゲッター/セッターを使用してカプセル化を達成します。
public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { this.balance += amount; } }
  • 継承は、extendsキーワードを使用して既存のクラスを基に新しいクラスを作成することを可能にします。これにより、コードの再利用が促進されます。
public class Animal {} public class Dog extends Animal {}
  • 多態性は、1つのインターフェースが複数のタイプに機能する能力として現れます。Javaでは、メソッドのオーバーライドとインターフェースを通じてこれを達成します。
Animal animal = new Dog(); animal.makeSound(); // Dogの実装が呼び出される
  • 抽象化は、抽象クラスやインターフェースを宣言することで達成され、複雑なシステムを単純化します。
public interface Drawable { void draw(); }

ひっかけ問題。

Javaでクラスがインターフェースと抽象クラスの両方を継承し、同じシグネチャのメソッドがある場合はどうなりますか?継承されたクラスはどのような動作を示しますか?

回答: 抽象クラスとインターフェースが同じメソッドシグネチャを定義している場合、派生クラスでそのメソッドを1回実装するだけで済みます。しかし、抽象クラスがそのメソッドを実装している場合、Javaはその実装を使用します。インターフェースのデフォルトメソッドは必要に応じてオーバーライドされます。

interface A { default void foo() { System.out.println("A"); }} abstract class B { void foo() { System.out.println("B"); }} class C extends B implements A {} // new C().foo() は "B" を出力します

このテーマの詳細を知らないことによる実際のエラーの例。


物語

銀行のプロジェクトで、開発者はすべてのフィールドをpublicにし、直接アクセスしていました。これにより、オブジェクトの状態が制御不能に変化し、エラーの追跡が困難になりました。その結果、すべてのコードをprivateフィールドとアクセサメソッドを使用するように書き直さなければなりませんでした。


物語

新しい従業員の一人が、基底クラスのprivateメソッドをオーバーライドしようとしましたが、これが多態性を支持するものだと考えていました。しかし、実際には子クラスで新しいメソッドが作成され、基底クラスからの呼び出しは元のバージョンを呼び出し、予期しない動作を引き起こしました。


物語

複数のソースからのデフォルトメソッドを持つインターフェースの使用は、「class X inherits unrelated defaults for Y() from types A and B」というエラーを引き起こしました — 従業員はそのような衝突が子クラスで手動で解決されるべきであることを知らなかったのです。