#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
間違えたものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。
##環境
言語:Java11、JDK13.0.2
動作環境:Windows10
#インスタンス
以前、オブジェクトとインスタンスを混同して話していたように記憶しているが、改めて触れてみたい。
まずはいつもの通りCat
クラスを用意する。
class Cat
{
public static int sumCats = 0;
private int age;
private double weight;
public Cat()
{
age = 0;
weight = 0.0;
sumCats++;
System.out.println("新しい猫ちゃんがやってきましたよ!");
}
public void setCat(int a,double w)
{
age = a;
weight = w;
System.out.println("この猫、年齢は" + age + "歳、体重は" + weight + "kgです。");
}
public static void showSumCats()
{
System.out.println("今は全部で" + sumCats + "匹の猫がいます。");
}
}
このCat
クラスを使って2匹の猫を用意した場合を考える。
・2匹の猫は、同じCat
クラス由来である別々のオブジェクトである。
・2匹の猫は、それぞれのage,weight
フィールドを有している。
以上のとき、2匹の猫はそれぞれのオブジェクトに関連付けられたフィールドである**インスタンス変数(instance variable)と、オブジェクトに関連付けられたメソッドであるインスタンスメソッド(instance method)**を有する。
これらインスタンスな変数とメソッドは「オブジェクトが生成(new
)されてからアクセス可能になる」。
今まで持っていた誤解
・オブジェクト≒インスタンス
⇒オブジェクト毎のフィールド・メソッド = インスタンス変数・メソッド new!!
##クラス変数・クラスメソッド
しかし、オブジェクトが生成されるより前に扱いたいメンバ(フィールド・メソッド)もある。そのために、クラスそのものと関連付けがなされたメンバをstatic
で宣言して使うことが出来る。
public static void showSumCats()
は、
public static int sumCats = 0;
と宣言された**クラス変数sumCats
を参照し、new
するたびにコンストラクタCat()**が呼び出され、自動でインクリメントされるようになっている。これにより、「何回Catオブジェクトを生成したか」と「猫の総数」をリンクさせている。
showSumCats()
は、static
であるため、「一度もCatオブジェクトを生成していな」くても呼び出すことが出来るメソッドである。よって「猫0匹」を示すこともできる。
##this.ってなんだろう
インスタンスメソッド内でのみ、this.age
やthis.weight
と書いて、オブジェクトに関連付けられたフィールド値のみを示すように書くことが出来る。
ローカル変数の話は割愛。
#終わりに
これからmain関数内で扱おうとしている変数・メソッドがクラス関連かオブジェクト関連か、static
で判別してよく理解していないと、ここを突かれる問題はかなり多い。
#参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。