この章では、クラスのフィールドについてもうちょっと詳しく見ていくことにします。
まずは、次のプログラムを見てください。
// field01.cs
using System;
class MyClass
{
int x;
public void Show()
{
Console.WriteLine("x = {0}", x);
}
public void Set(int y)
{
x = y;
}
}
class field01
{
public static void Main()
{
MyClass mc = new MyClass();
mc.Show();
mc.Set(100);
mc.Show();
}
}
MyClassクラスには、インタンスフィールドのxがあります。アクセス修飾子が省略されているのでprivateとみなされ、このクラス以外からはアクセス不能です。Showメソッドは、xの値を表示するメソッドです。
Setメソッドは、引数yをxに代入するメソッドです。
Mainメソッド側では、まずMyClassクラスのインスタンスを生成しています。
次に、いきなりmc.Show();でxの値を表示しようとしています。xには、まだ値を代入していませんね。しかし、インスタンスフィールドは、インスタンス生成の時自動的に初期化されるので問題有りません。「x = 0」と表示されるでしょう。
次に、mc.Set(100);として、xに100を代入しています。その後mc.Show();でxの値を表示させています。
では、実行結果を見てみましょう。
次のプログラムの実行結果はどのようになるか、考えてみてください。
// field02.cs
using System;
class MyClass
{
public static int x;
public int y;
public void Show()
{
Console.WriteLine("x = {0}, y = {1}", x, y);
}
}
class field02
{
public static void Main()
{
MyClass.x = 10;
MyClass mc1 = new MyClass();
mc1.y = 20;
Console.WriteLine("1回目-------");
mc1.Show();
MyClass mc2 = new MyClass();
Console.WriteLine("2回目-------");
mc2.Show();
MyClass mc3 = new MyClass();
mc3.y = 500;
Console.WriteLine("3回目-------");
mc3.Show();
mc3 = mc2;
Console.WriteLine("4回目-------");
mc3.Show();
}
}
MyClassクラスには、静的フィールドのxと、インスタンスフィールドのyが有ります。
また、Showメソッドはxやyの値を表示するメソッドです。Mainメソッドでは、MyClass.x = 10;として、静的フィールドxに10を代入しています。
次にMyClassのインスタンスを生成して、その参照をmc1に代入しています。
ここで、mc1.y = 20;としてインスタンスフィールドyに20を代入しています。
そこで、第1回目のmc1.Show();を実行するとどのように表示されるでしょうか。 当然yは20ですね。xはどうでしょうか。静的フィールドは、そのクラスのすべてのインスタンスに反映されるのでxの値は10なのです。「x = 10, y = 20」と表示されるでしょう。
次に、またインスタンスを生成してその参照をmc2としています。ここで、いきなり第2回目の表示をさせています。インスタンスフィールドには先ほど20を代入したので「y = 20」と表示されるのでしょうか。答はノーです。インスタンスフィールドは、その名の通りそれぞれのインスタンス固有のものです。mc2のyには、まだ何も代入していないのでyは0のはずです。従って「x = 10, y = 0」と表示されるはずです。
次に、またインスタンスを生成してmc3としています。mc3.y = 500;としmc3のインスタンスフィールドyに500を代入しています。当然mc3.Show();を実行するとx = 10, y = 500」と表示されますね。
さて、次にmc3 = mc2;としています。これは、mc2の参照をmc3に代入しているのですね。 すると、mc3.Show();はmc2.Show();と同じことになります。第4回目の表示では、「x = 10, y = 0」となるはずです。
では、実行結果を見てみましょう。
Update 29/Aug/2006 By Y.Kumei