私たちは常にオブジェクトを作成するためにクラスを定義してきました。オブジェクトは機能を備えたエンティティであり、クラスはオブジェクトの型分類です。これはオブジェクト指向の基本的な概念です。
継承では、クラスを拡張可能な主題として扱うため、「クラス」についての理解が深まります。
クラス自体については、話し合うべきことがまだたくさんあります。これからも深めていきます
静的データメンバー
クラスの状態を表現するために使用されるデータがいくつかあります。たとえば、Human クラスでは、「population」を使用して Human クラス内のオブジェクトの総数を表すことができます。 「人口」はオブジェクトではなくクラスの状態を直接記述します。
人間クラスの人口は 8 人です
クラスのすべてのオブジェクトは「人口」データを共有します。このようなデータをクラスデータメンバ(クラスフィールド)と呼びます。
クラス定義では、次のように static キーワードを使用してクラス データ メンバーを宣言します。
次のようにコードをコピーします。
クラス人間
{
/**
* コンストラクター
*/
public Human(int h)
{
this.height = h;
}
/**
*アクセサ
*/
public int getHeight()
{
this.height を返します。
}
/**
* ミューテーター
*/
public void 成長高さ(int h)
{
この高さ = この高さ + h;
}
/**
*呼吸
*/
パブリックボイドブレス()
{
System.out.println("ふ…ふ…");
}
プライベート int 高さ;
プライベート静的 int 母集団。
パブリック静的ブール値 is_mammal = true;
}
2 つのクラス データ メンバー、population と is_mammal を定義します。すべての Human オブジェクトは人口データを共有します。どの Human オブジェクトの is_mammal (哺乳動物である) 属性も true です。
クラス データ メンバーもアクセス権限を設定する必要があります。 public として宣言されたクラス データ メンバーについては、class.field または object.field (このクラスのオブジェクトが存在する場合) を使用して外部から直接アクセスできます。クラス データ メンバーはクラスの属性として考えることができ、すべてのメンバーによって共有される属性として考えることができるため、どちらのアクセス方法も合理的です。クラス データ メンバーがプライベートとして定義されている場合、クラス データ メンバーにはクラス内からのみアクセスできます。
(上記では、デモのために Is_mammal を公開に設定しています。これは非常に危険です。誰かが Human.is_mammal=false; を使用すると、すべての人類が被害を受けることになります。繰り返しになりますが、基本原則は、データを可能な限り非公開に設定することです。)
静的メソッド
静的として宣言されたメソッドであるクラス メソッドを使用することもできます。クラス メソッドは、クラスが実装できるアクションを表し、その操作には特定のオブジェクトは関与しません。メソッドが静的として宣言されている場合、メソッドは静的なデータとメソッドのみを呼び出すことができますが、非静的データとメソッドは呼び出すことができません。
実際、静的メソッドでは、this パラメーターと super パラメーターが暗黙的に渡されることはありません。オブジェクトに属するデータとメソッドを参照する方法はありません (これがまさに私たちが望んでいることです)。
上記の内容に基づいて、次の関係が成り立ちます。
赤い点線はアクセスできないことを示します。つまり、クラス メソッドではオブジェクトのデータにアクセスできません。
次に、静的データ母集団を返す静的メソッド getPopulation() を追加します。
次のようにコードをコピーします。
クラス人間
{
/**
* コンストラクター
*/
public Human(int h)
{
this.height = h;
}
/**
*アクセサ
*/
public int getHeight()
{
this.height を返します。
}
/**
* ミューテーター
*/
public void 成長高さ(int h)
{
この高さ = この高さ + h;
}
/**
*呼吸
*/
パブリックボイドブレス()
{
System.out.println("ふ…ふ…");
}
プライベート int 高さ;
/*
* 静的メソッド、アクセス人口
*/
public static int getPopulation()
{
人間の人口を返します。
}
プライベート静的 int 母集団。
プライベート静的ブール値 is_mammal = true;
}
クラス メソッドを呼び出すときは、class.method() または object.method() を通じて呼び出すことができます。たとえば、次の Test クラス テストを使用します。
次のようにコードをコピーします。
パブリッククラステスト
{
public static void main(String[] args)
{
System.out.println(Human.getPopulation());
人間 aperson = 新しい人間(160);
System.out.println(aperson.getPopulation());
}
}
クラス定義の外でクラス メソッド getPopulation() を 2 つの方法で呼び出しました。
オブジェクトメソッドはクラスデータを変更します
オブジェクト メソッドがクラス データにアクセスできることがわかります。これは非常に便利な概念です。クラスの状態はオブジェクトによって変化する可能性があります。たとえば、オブジェクトが作成されると「人口」が 1 ずつ増加する必要があります。オブジェクトのメソッドでクラスの「人口」データを変更できます。以下のコンストラクターでクラス データ メンバーにアクセスします。ここでの構築メソッドは非静的メソッド、つまりオブジェクト メソッドです。
次のようにコードをコピーします。
クラス人間
{
/**
* コンストラクター
*/
public Human(int h)
{
this.height = h;
人間の人口 = 人間の人口 + 1;
}
/**
*アクセサ
*/
public int getHeight()
{
this.height を返します。
}
/**
* ミューテーター
*/
public void 成長高さ(int h)
{
この高さ = この高さ + h;
}
/**
*呼吸
*/
パブリックボイドブレス()
{
System.out.println("ふ…ふ…");
}
プライベート int 高さ;
/*
* 静的メソッド、アクセス人口
*/
public static int getPopulation()
{
人間の人口を返します。
}
プライベート静的 int 母集団。
プライベート静的ブール値 is_mammal = true;
}
オブジェクトを作成するたびに、オブジェクトの構築メソッドを通じてクラス データを変更し、人口クラス データを 1 ずつ増やします。このようにして、人口はこのクラスに属するオブジェクトの総数をリアルタイムで反映できます (Test で複数のオブジェクトを作成し、Human.population を出力できます)。
上記のコンストラクターの例に加えて、通常のオブジェクト メソッドでクラス データにアクセスすることもできます。
ファイナル
Final キーワードの基本的な意味は次のとおりです。このデータ/メソッド/クラスは変更できません。
1. 最終的な基本型データ: 定数値。一度だけ割り当てることができ、再度変更することはできません。
2.最終メソッド: このメソッドはオーバーライドできません。プライベート メソッドのデフォルトは Final メソッドです。
3.最終クラス:このクラスは継承できません。
通常の型のオブジェクトにも、final キーワードを含めることができます。これは、オブジェクト参照 (reference) を変更できなくなることを意味します。つまり、参照は 1 つのオブジェクトのみを指すことができます。ただし、オブジェクトの内容は変更される可能性があります (C の静的ポインターと同様)。オブジェクト参照については後ほど説明します。
基本タイプのデータがfinalかつstaticの場合、固定値のコピーを1つだけ保存します。これは、pi などの定数を保存するのに最適です。
要約する
静的フィールド、静的メソッド
class.static_method()
ファイナル