1前書き

このチュートリアルでは、** Java言語での変数とメソッドの非表示について説明します。

まず、これらの各シナリオの概念と目的を理解します。その後、ユースケースを詳しく調べ、さまざまな例を調べます。


2変数隠蔽

変数隠蔽は、外側のスコープにすでにあるものと同じ名前を持つローカルのスコープにあるプロパティを宣言すると発生します。

例に進む前に、Javaで可能な変数スコープを簡単に要約しましょう。以下のカテゴリーでそれらを定義することができます。

  • ローカル変数 – メソッドなどのコードで宣言されています。

中括弧を含む任意のコードブロック内のコンストラクタ
** インスタンス変数 – クラスの内部で定義され、

オブジェクトのインスタンス
** クラス変数または静的変数 – クラス内で次のように宣言されます。


static

キーワード彼らはクラスレベルのスコープを持っています。

それでは、変数の個々のカテゴリごとに、例を使って非表示にすることについて説明しましょう。


2.1. 地方の力


HideVariable

クラスを見てみましょう。

public class HideVariable {

    private String message = "this is instance variable";

    HideVariable() {
        String message = "constructor local variable";
        System.out.println(message);
    }

    public void printLocalVariable() {
        String message = "method local variable";
        System.out.println(message);
    }

    public void printInstanceVariable() {
        String message = "method local variable";
        System.out.println(this.message);
    }
}

ここでは

__message

__variableを4か所で宣言しています。

コンストラクター内で宣言されたローカル変数と2つのメソッドは、インスタンス変数を隠しています。

オブジェクトの初期化とメソッドの呼び出しをテストしましょう。

HideVariable variable = new HideVariable();
variable.printLocalVariable();

variable.printInstanceVariable();

上記のコードの出力は次のとおりです。

constructor local variable
method local variable
this is instance variable

ここで、最初の2つの呼び出しはローカル変数を取得しています。

ローカルスコープからインスタンス変数にアクセスするには、

printInstanceVariable()

メソッドに示されているように

this

キーワードを使用できます。


2.2. 隠れることとその階層

同様に、子クラスと親クラスの両方に同じ名前の変数がある場合、その子変数は親クラスから変数を隠します。

親クラスがあるとしましょう。

public class ParentVariable {

    String instanceVariable = "parent variable";

    public void printInstanceVariable() {
        System.out.println(instanceVariable);
    }
}

その後、子クラスを定義します。

public class ChildVariable extends ParentVariable {

    String instanceVariable = "child variable";

    public void printInstanceVariable() {
        System.out.println(instanceVariable);
    }
}

それをテストするために、2つのインスタンスを初期化しましょう。 1つは親クラスを持ち、もう1つは子を使って、それぞれのメソッドで

printInstanceVariable()

メソッドを呼び出します。

ParentVariable parentVariable = new ParentVariable();
ParentVariable childVariable = new ChildVariable();

parentVariable.printInstanceVariable();
childVariable.printInstanceVariable();

出力は、プロパティの非表示を示しています。

parent variable
child variable

  • ほとんどの場合、親クラスと子クラスの両方で同じ名前の変数を作成しないでください。代わりに、

    __private

    __のような適切なアクセス修飾子を使用し、そのためのgetter/setterメソッドを提供してください。


3メソッド非表示

メソッドの隠蔽は、Javaのあらゆる階層構造で発生する可能性があります。子クラスが親クラスの静的メソッドと同じシグネチャを持つ静的メソッドを定義すると、子のメソッドは親クラスのメソッドを非表示にします。

static

キーワードの詳細については、link:/spring-bean-scopesを参照してください。

インスタンスメソッドに関連する同じ動作は、メソッドオーバーライドと呼ばれます。メソッドオーバーライドの詳細については、次のリンクをチェックしてください。/java-method-overload-override[ガイドはこちら]。

それでは、この実用的な例を見てみましょう。

public class BaseMethodClass {

    public static void printMessage() {
        System.out.println("base static method");
    }
}


BaseMethodClass

には単一の

printMessage()static

メソッドがあります。

次に、基本クラスと同じシグネチャを持つ子クラスを作成しましょう。

public class ChildMethodClass extends BaseMethodClass {

    public static void printMessage() {
        System.out.println("child static method");
    }
}

その仕組みは次のとおりです。

ChildMethodClass.printMessage();


printMessage()

メソッド呼び出し後の出力

child static method


__ChildMethodClass.printMessage()は、

BaseMethodClass__のメソッドを非表示にします。


3.1. メソッド隠蔽とオーバーライド

静的メソッドは多態的ではないため、非表示はオーバーライドのようには機能しません。オーバーライドはインスタンスメソッドでのみ発生します。これは遅延バインディングをサポートしているため、どのメソッドが呼び出されるかは実行時に決定されます。

  • 一方、メソッド隠蔽は静的なものと一緒に動作します。そのため、コンパイル時に決定されます** 。


4結論

この記事では、Javaにおけるメソッドと変数の隠蔽の概念について説明しました。可変隠蔽とシャドウイングの異なるシナリオを示しました。この記事の重要なハイライトは、オーバーライド方法と非表示方法を比較することです。

いつものように、完全なコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-lang-oop[over on GitHub]から入手できます。