ホームページ  >  記事  >  Java  >  Java で OOP をクラッキング: スライスして食べたいパイ

Java で OOP をクラッキング: スライスして食べたいパイ

Susan Sarandon
Susan Sarandonオリジナル
2024-10-28 11:38:02977ブラウズ

Cracking OOP in Java: A PIE You’ll Want a Slice Of

この投稿では、Java のオブジェクト指向プログラミング (OOP) の 4 つの基本的な柱 について説明します。これらの中心原則は、コードをモジュール化して再利用可能、保守可能に構造化するのに役立ちます。この投稿は入門として機能し、今後のエントリでは、微妙な議論と例を使用して各概念をさらに深く掘り下げます。

覚えやすくするために、頭字語 「A PIE」 を使用します: A抽象化、P異型性、I継承、およびEカプセル化。


オブジェクト指向とはどういう意味ですか?

Java は、オブジェクト指向言語としてよく説明されますが、100% オブジェクト指向ではありません。 なぜ? Java のほとんどの要素はオブジェクト (クラス、オブジェクト、メソッドなど) を中心に展開しますが、プリミティブ型 (int、boolean、double など) も使用します。 🎜>オブジェクトではありません

Java でプリミティブ型を保持することは、意図的な設計上の選択でした。その理由は次のとおりです:

  • メモリ効率: プリミティブ型は、対応するオブジェクト (整数やブール値など) と比較して、使用するメモリが少なくなります

  • パフォーマンスの向上: オブジェクトの作成と参照管理のオーバーヘッドが回避されるため、プリミティブの操作が 高速化します。

  • 利便性: プリミティブ型を使用すると、単純な場合、特に算術演算および論理演算を扱う場合にコードがすっきりします。

つまり、

Java は、パフォーマンスとメモリ効率のためのプリミティブを提供すると同時に、これらの値をオブジェクトとして扱う必要がある場合に備えて ラッパー クラス (Integer など) も提供することでバランスをとっています


1.

抽象化: 不必要な詳細を隠す

抽象化とは、

内部ロジックを隠し、重要な機能のみをユーザーに公開することを意味します。これにより、ユーザーは根底にある複雑さを気にすることなく、高レベルでオブジェクトを操作できるようになります。 ATM を使用するものと考えてください。ATM が取引を処理するために銀行とどのようにやり取りするのかを知らなくても、引き出す金額を入力するだけで済みます。

Java では、

抽象クラスインターフェース は、必須メソッド を定義し、内部の詳細を子クラスまたは親クラス内に残すことで抽象化を実現します。ただしユーザーには隠されています。

例:

abstract class Payment {
    // A method with concrete logic, hidden from the user.
    private void authenticate() {
        System.out.println("Authenticating payment...");
    }

    // Abstract method that child classes must implement.
    abstract void processPayment(double amount);

    // Public method exposing only the necessary details.
    public void makePayment(double amount) {
        authenticate();  // Hidden complexity
        processPayment(amount);  // Exposed to child classes
        System.out.println("Payment completed.");
    }
}

// Concrete class implementing the abstract method.
class CreditCardPayment extends Payment {
    @Override
    void processPayment(double amount) {
        System.out.println("Processing credit card payment of ₹" + amount);
    }
}

public class TestAbstraction {
    public static void main(String[] args) {
        Payment payment = new CreditCardPayment(); // Polymorphism in action.
        payment.makePayment(1000.00);  // Only high-level interaction.
    }
}
説明:

  • 複雑さはどこに隠されていますか?

    • authenticate() メソッドは、子クラスとユーザーの両方に対してプライベートかつ非表示である内部ロジック (ユーザー検証、暗号化など) を表します。
    • makePayment() メソッドは、ユーザーが利用できる唯一のパブリック メソッドで、支払いシステムと対話する簡単な方法を提供します。
  • 抽象クラスはどのように役立ちますか?

    • 子クラス (CreditCardPayment など) にコア ロジック (processPayment()) を実装するよう 強制しますが、子クラス は認証ロジックについて知る必要はありません - 親クラスで処理されます。
  • ユーザーには何が表示されますか?

    • ユーザーの観点から見ると、ユーザーは makePayment() とのみ対話します。認証クレジット カード支払いが内部でどのように機能するか については気にしません。

2. ポリモーフィズム: 同じアクション、異なる形式

ポリモーフィズムにより、オブジェクトは状況に応じて異なる動作をすることができます。 Java は 2 種類のポリモーフィズムをサポートしています。

1.コンパイル時のポリモーフィズム (メソッドのオーバーロード): 同じ名前でパラメーターが異なる複数のメソッドを定義することで実現されます。

例:

abstract class Payment {
    // A method with concrete logic, hidden from the user.
    private void authenticate() {
        System.out.println("Authenticating payment...");
    }

    // Abstract method that child classes must implement.
    abstract void processPayment(double amount);

    // Public method exposing only the necessary details.
    public void makePayment(double amount) {
        authenticate();  // Hidden complexity
        processPayment(amount);  // Exposed to child classes
        System.out.println("Payment completed.");
    }
}

// Concrete class implementing the abstract method.
class CreditCardPayment extends Payment {
    @Override
    void processPayment(double amount) {
        System.out.println("Processing credit card payment of ₹" + amount);
    }
}

public class TestAbstraction {
    public static void main(String[] args) {
        Payment payment = new CreditCardPayment(); // Polymorphism in action.
        payment.makePayment(1000.00);  // Only high-level interaction.
    }
}

2.実行時ポリモーフィズム (メソッドのオーバーライド): サブクラスが、親クラスで宣言されたメソッドの特定の実装を提供するときに達成されます。

例:

class Calculator {
    // Compile-time polymorphism (Overloading)
    int add(int a, int b) {
        return a + b;
    }
    int add(int a, int b, int c) {
        return a + b + c;
    }

    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(2, 3));  // Output: 5
        System.out.println(calc.add(2, 3, 4));  // Output: 9
    }
}

説明:

コンパイル時ポリモーフィズムは add() メソッドをオーバーロードすることで示され、実行時ポリモーフィズムは sound() メソッドをオーバーライドすることによって示されます。

sound() メソッドは、オブジェクトのタイプに基づいて動作が異なります。 Animal のタイプは Animal ですが、実行時 で、Dog でオーバーライドされたメソッドが実行されます。


3. 継承: 親子関係によるコードの再利用性

継承により、クラス (子) は別の クラス (親) のプロパティと動作を再利用できます。これにより、コードの再利用性が促進され、クラス間にIS-A 関係が確立されます。 Java は、曖昧さを避けるためにクラスを介した 多重継承 をサポートしていませんが、インターフェイスを介したそれは許可しています。

例:

class Animal {
    void sound() {
        System.out.println("Animals make sounds.");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Dog barks.");
    }
}

public class TestPolymorphism {
    public static void main(String[] args) {
        Animal animal = new Dog();  // Runtime polymorphism
        animal.sound();  // Output: Dog barks
    }
}

説明:

この例では:

  • 犬は動物から継承しています。つまり、犬は食べる吠えるの両方ができます。

  • これは コードの再利用を示しています。Dog クラスの Eat() メソッドを書き直す必要はありません。


4. カプセル化: アクセス制御によるデータの保護

カプセル化とは、データ (フィールド) とそれを操作するメソッドを 1 つのユニット (クラス) にバンドルすることを意味します。 また、フィールドをプライベートにして公開することで、データの隠蔽 も保証します。 ゲッターとセッターを通じて。

例:

abstract class Payment {
    // A method with concrete logic, hidden from the user.
    private void authenticate() {
        System.out.println("Authenticating payment...");
    }

    // Abstract method that child classes must implement.
    abstract void processPayment(double amount);

    // Public method exposing only the necessary details.
    public void makePayment(double amount) {
        authenticate();  // Hidden complexity
        processPayment(amount);  // Exposed to child classes
        System.out.println("Payment completed.");
    }
}

// Concrete class implementing the abstract method.
class CreditCardPayment extends Payment {
    @Override
    void processPayment(double amount) {
        System.out.println("Processing credit card payment of ₹" + amount);
    }
}

public class TestAbstraction {
    public static void main(String[] args) {
        Payment payment = new CreditCardPayment(); // Polymorphism in action.
        payment.makePayment(1000.00);  // Only high-level interaction.
    }
}

説明:

  • 名前フィールドはプライベートです。つまり、クラスの外部から直接アクセスできません。

  • アクセスは パブリックゲッターおよびセッター を通じて提供され、データ隠蔽 を強制します。


結論

Java の OOP 原則抽象化、ポリモーフィズム、継承、およびカプセル化—は、モジュール式で保守可能で効率的なコードを作成するための基盤を形成します。これらの概念を理解すれば、複雑なシステムを設計して理解する準備が整います。

今後の投稿では、より微妙な例、ベスト プラクティス、面接に焦点を当てたヒントを使用して、これらの原則のそれぞれをさらに深く掘り下げていきます。乞うご期待!


関連記事

  • Java の基礎

  • アレイインタビューの要点

  • Java メモリの基礎

  • Java キーワードの基礎

  • コレクション フレームワークの基本

コーディングを楽しんでください!

以上がJava で OOP をクラッキング: スライスして食べたいパイの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。