「新しいトピックに移りましょう。次に、静的変数と静的メソッドについて説明したいと思います。」

「エリー、静的変数と静的メソッドについてはすでに学習しました。でも、もっと詳しく学びたいのです。」

「クラスで変数を宣言するとき、これらの変数が 1 回だけ作成されるか、それともクラスの各インスタンス (オブジェクト) が独自のコピーを持つかを定義します。デフォルトでは、変数の新しいコピーがオブジェクトごとに作成されます」 . 見た目はこんな感じです。」

クラス宣言
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
mainメソッドのコード:
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
画面出力
Oscar
Missy

「同じクラス (Cat) で宣言されているにもかかわらず、変数cat1.nameと はcat2.name異なるオブジェクトを参照するため、異なる値を含みます。」
"それは理にかなっている。"
「ただし、静的変数のコピーはクラスのインスタンスごとに 1 つだけ存在し、クラス名を使用してアクセスする必要があります。」

クラス宣言
class Cat                   // Сlass
{
    String name;            // Instance (non-static) variable
    static int catCount;    // Static variable

    Cat(String name)
    {
        this.name = name;
        Cat.catCount++;   // Increment the static variable by 1
    }
}
main メソッドのコード:
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");

System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");

System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
画面出力:
0
1
Oscar
Missy
2

「なるほど、それも当然ですね。」

「Java メソッドは 2 つのカテゴリに分類されます。インスタンス メソッドはオブジェクトに対して呼び出され、そのオブジェクトのデータにアクセスできます。 静的メソッドにはオブジェクト参照がないため、そのアクセス権はありません。ただし、静的メソッドはオブジェクトを参照できます。クラスの静的変数とその他の静的メソッド。

静的メソッドは非静的メソッドまたは非静的変数に対応できません。」

「それはなぜですか、エリー?」

「各インスタンス変数はオブジェクトに含まれています。そのオブジェクトへの参照がある場合にのみアクセスできます。静的メソッドではそのような参照は使用できません。」

「インスタンスメソッドにはそのような参照はありますか?」

「はい、間接的にインスタンス メソッドに渡されます。インスタンス メソッドが呼び出されるオブジェクトへの参照は、間接的にインスタンス メソッドに渡されます。この参照を格納する変数はthisと呼ばれます。これにより、メソッドは常にオブジェクトのオブジェクトにアクセスできるようになります。」データを呼び出すか、同じオブジェクトに対して別の非静的メソッドを呼び出します。

オブジェクト参照の代わりに、null が静的メソッドに渡されます。そのため、静的でない変数やメソッドには対処できません。これらの変数やメソッドに関連付けられたオブジェクトへの参照がないだけです。」

「わかった、エリー、それはわかったよ。」

「非静的メソッドは次のように動作します。

コードはどのようになるか
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
本当に何が起こるのか
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
<object> dot <method name> を使用してメソッドを呼び出すと、実際にはクラス メソッドを呼び出し、同じオブジェクトを最初の引数として渡します。メソッド内では、オブジェクトは'this'と呼ばれます。メソッド内のすべての操作は、このオブジェクトとそのデータに対して実行されます。」

「静的メソッドの仕組みは次のとおりです。

コードはどのようになるか
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
本当に何が起こるのか
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
静的メソッドを呼び出した場合、オブジェクトは渡されません。言い換えれば、「this」はnullと等しくなります。これが、静的メソッドが非静的変数やメソッドにアクセスできない理由です (非静的メソッドに暗黙的に渡すものがないため)。

「変数またはメソッドの前にキーワード static がある場合、その変数またはメソッドは静的です。」

「これほど厳しく制限されているのに、なぜそのような方法が必要なのでしょうか?」

「そうですね、そのような方法にも利点はあります。」

「まず、静的メソッドと変数を使用するためにオブジェクト参照を渡す必要はありません。

「第 2 に、変数のコピーが 1 つだけ必要になる場合があります。たとえば、System.out (System クラスの静的 out 変数) です。」

「第三に、オブジェクトを作成する前にメソッドを呼び出す必要がある場合があります。」

「エリー、これの例を教えてもらえますか?」

「なぜmain()メソッドは静的だと思いますか?これは静的であるため、プログラマはクラスをメモリにロードした直後、オブジェクトが作成される前にこのメソッドを呼び出すことができます。」