1. オブジェクト
Java ではすべてがオブジェクトです。
より正確に言えば、Java にはオブジェクトではないものはほとんどありません。たとえば、プリミティブ型。しかし、これはこのルールのかなり稀な例外です。
では、オブジェクトとは何でしょうか?
オブジェクトは、データとそのデータを処理するメソッドをグループ化するエンティティです。「データ」というときは、もちろん変数を意味します。
オブジェクトの変数は、その「データ」または「状態」と呼ばれます。
オブジェクトのメソッドは、その「動作」であると言われます。オブジェクトの状態 (変数) を変更するには、そのオブジェクトのメソッドのみを使用するのが一般的です。オブジェクトの変数を (オブジェクトのメソッドを使用せずに) 直接変更することは、悪い形式とみなされます。
すべてのオブジェクトとすべての変数には型があります。このタイプはオブジェクトの作成時に一度決定され、将来変更することはできません。オブジェクトのタイプはそのクラスです。
各オブジェクトには、インスタンス変数 (フィールド) の独自のコピーがあります。非静的 int a 変数がクラスで宣言されており、プログラムがそのクラスの 10 個のオブジェクトを作成する場合、各オブジェクトは独自の int a 変数を持つことになります。
オブジェクトとの対話
オブジェクトを操作する最も便利な方法は、オブジェクトへの参照を変数に保存し、その変数のメソッドを呼び出すことです。これは見覚えがあるでしょう:
variable.method()
ここで、variable
はオブジェクトへの参照を格納する変数であり、 はmethod
そのクラスのメソッドです。
オブジェクトのフィールド (変数) を参照したい場合は、ドット演算子も使用する必要があります。
variable.field
ここで、variable
はオブジェクトへの参照を格納する変数であり、 はfield
インスタンス変数 (フィールド) です。
2.new
オペレーター
特定のクラスのオブジェクトを作成するには、new
演算子を使用する必要があります。一般に、オブジェクトを作成すると次のようになります。
Class variable = new Class(arguments);
ここで、は変数Class
のクラスの名前variable
と、作成されるオブジェクトのクラスの名前です。そしてvariable
、作成されたオブジェクトへの参照を格納する変数です。And はarguments
、コンストラクターに渡される引数のカンマ区切りリストのプレースホルダーです。
渡すことができる引数の具体的なリストは、クラスを作成するプログラマによって決定されます。
あなたは以前にもオブジェクトを作成し、この特定の構造を使用したことがあります。忘れていないと思いますが?
Scanner console = new Scanner(System.in);
int x = console.nextInt();
Scanner console
— これにより、console
型が の変数が作成されますScanner
。— これにより、新しいオブジェクトが作成されます。そして、代入演算子は、変数を新しく作成されたオブジェクトへの参照と等しく設定します。new Scanner(System.in)
Scanner
console
2 行目では、オブジェクトへの参照を保存する変数を使用して、オブジェクトのnextInt()
メソッドを呼び出します。Scanner
console
Scanner
オブジェクト作成の例:
コード | 説明 |
---|---|
|
String オブジェクトを作成する |
|
Scanner オブジェクトを作成する |
|
要素int[] のコンテナーを作成します。10 int |
作成されたオブジェクトは、クラスのオブジェクトまたはクラスのインスタンスと呼ばれ、クラスはオブジェクトのクラスと呼ばれます。たとえば、s
変数にはクラスのインスタンスへの参照が格納されますString
。
3. 授業の紹介
他のプログラマが作成したクラスを使用することがいかに便利であるかはすでにお分かりいただけたと思います。しかし、独自のクラスを作成する場合はどうでしょうか?
独自のクラスが必要なとき、どこで、どのように作成するかをどのようにして知るのでしょうか?
プログラマは通常、プログラムに新しいエンティティを導入する場合、独自のクラスを作成します。わかりにくいと思いませんか?それでは説明していきたいと思いますが、遠いところから始めます。
データのグループ
少し単純化すると、Java のオブジェクトは、クラスで宣言された変数 (インスタンス フィールド) を含むメモリのブロックであると言えます。言い換えれば、変数をグループに結合したものです。
プログラムで点の座標を保存する必要があり100
、それを画面上に表示するメソッドが必要だとします。これは配列を使用して実行できます。たとえば、次のようになります。
class Solution
{
public static void printPoints(int[] x, int[] y, int[] color)
{
for (int i = 0; i < x.length; i++)
System.out.println("Color of (" + x[i] + ", " + y[i] + ") = " + color[i]);
}
public static void main(String[] args)
{
int[] x = new int[100];
int[] y = new int[100];
int[] color = new int[100];
printPoints(x, y, color);
}
}
点に関するすべての情報を単一の型で保存できればx
、y
はるかに便利ですcolor
。そのような型が Java に存在しない場合は、自分で作成できます。
これを行うには、クラスのコードを作成しますPoint
。
public class Point
{
public int x;
public int y;
public int color;
}
上記のコードは次のように書き換えることができます。
class Solution
{
public static void printPoints(Point[] points)
{
for (int i = 0; i < points.length; i++)
System.out.println("Color of (" + points[i].x + ", " + point[i].y + ") = " + points[i].color);
}
public static void main(String[] args)
{
Point[] data = new Point[100];
for (int i = 0; i < data.length; i++)
data[i] = new Point();
printPoints(data);
}
}
Point
次に、オブジェクトに関する情報を表示するメソッドをクラスに追加しましょう。
public class Point
{
public int x;
public int y;
public int color;
public void print()
{
System.out.println("Color of (" + x + ", " + y + ") = " + color);
}
}
クラスは次のSolution
ようになります。
class Solution
{
public static void printPoints(Point[] points)
{
for (int i = 0; i < points.length; i++)
points[i].print();
}
public static void main(String[] args)
{
Point[] data = new Point[100];
for (int i = 0; i < data.length; i++)
data[i] = new Point();
printPoints(data);
}
}
ポイントの座標と色の情報を、Point
ポイントの状態を表示するメソッドとともにクラス内に巧みに隠しました。
クラスはプログラムの複雑さを管理する方法です。大規模なプログラムは、多数の小さなクラスに分割すると複雑さが軽減されます。
4. 可変オブジェクトと不変オブジェクト
かつて、私たちは Java の定数を研究し、あまり快適ではない結論に達しました。定数を使用すると、変数が変更されないように保護できますが、定数が参照するオブジェクトの変更を防ぐことはできません。
この問題を解決するために、Java は定数オブジェクトを考案しました。または、より頻繁に呼ばれるように、不変オブジェクト。
ところで、オブジェクトを変更できないクラスについてはすでにご存知でしょうString
。オブジェクトString
は作成後は永久に変更されません。そして、Java の作成者はどのようにしてこれを達成したのでしょうか?
まず、String
クラスのすべての変数が非表示になります。つまり、 が宣言されますprivate
。
次に、String
クラスを継承することはできません。そのクラス宣言にはfinal
修飾子が含まれています。
3 番目に、最も興味深いのは、String
理論的には既存のオブジェクトを変更すると予想されるクラスのすべてのメソッドが、実際には変更せず、新しいオブジェクトを返すことです。
たとえば、このtoUpperCase()
メソッドは文字列内のすべての文字を大文字にします。ただし、メソッドが呼び出されるオブジェクトを変更する代わりに、String
大文字で構成される新しいオブジェクトが返されます。
String text = "This is a very important message";
String message = text.toUpperCase();
このコードを実行した後のメモリ内の内容は次のとおりです。
したがって、文字列を任意のメソッドに自由に渡しても構いません。誰も文字列を変更することはありません。
GO TO FULL VERSION