Java オブジェクトとクラス
オブジェクト指向言語としての Java。次の基本概念をサポートします:
ポリモーフィック
継承
パッケージ
抽象的な
クラス
オブジェクト
例
メソッド
オーバーロード
このセクションでは、オブジェクトとクラスの概念に焦点を当てます。
オブジェクト: オブジェクトはクラスのインスタンスであり (オブジェクトはガールフレンドを探しているわけではありません)、状態と動作を持ちます。たとえば、犬はオブジェクトです。そのステータスには、色、名前、品種が含まれます。また、その行動には、尻尾を振る、吠える、食べるなどがあります。
クラス: クラスは、あるタイプのオブジェクトの動作とステータスを記述するテンプレートです。
下の図では、男の子と女の子がクラスであり、それぞれの特定の人物がクラスのオブジェクトです:
Java のオブジェクト
それでは、オブジェクトとは何かを詳しく理解しましょう。あなたの周りの現実世界を見ると、車、犬、人など、多くの物体があなたの周りにあることがわかります。これらすべてのオブジェクトには独自の状態と動作があります。
犬のステータスには、名前、品種、色が含まれます。その行動には、吠える、尻尾を振る、走るなどがあります。
実際のオブジェクトとソフトウェア オブジェクトを比較すると、それらは非常に似ています。
ソフトウェア オブジェクトにも状態と動作があります。ソフトウェア オブジェクトの状態はその属性であり、その動作はメソッドを通じて反映されます。
ソフトウェア開発では、メソッドはオブジェクトの内部状態の変化に作用し、オブジェクト間の相互呼び出しもメソッドを通じて完了します。
Java のクラス
クラスは、Java オブジェクトを作成するためのテンプレートとして見ることができます。
次の簡単なクラスを通じて Java のクラスの定義を理解します:
public class Dog{ String breed; int age; String color; void barking(){ } void hungry(){ } void sleeping(){ } }
クラスには次のタイプの変数を含めることができます:
ローカル変数: メソッド、コンストラクター、またはステートメント ブロックで定義された変数はローカルと呼ばれます変数。変数の宣言と初期化はすべてメソッド内で行われ、メソッドが終了すると、変数は自動的に破棄されます。
メンバー変数: メンバー変数は、クラス内およびメソッド本体の外で定義される変数です。このような変数は、オブジェクトの作成時にインスタンス化されます。メンバー変数には、クラス メソッド、コンストラクター、およびクラス固有のステートメント ブロックによってアクセスできます。
クラス変数: クラス変数はメソッド本体の外のクラスでも宣言されますが、静的型として宣言する必要があります。
クラスには複数のメソッドを含めることができます。上記の例では、barking()、hungry()、sleeping() はすべて Dog クラスのメソッドです。
コンストラクター メソッド
すべてのクラスにはコンストラクター メソッドがあります。クラスにコンストラクターが明示的に定義されていない場合、Java コンパイラーはクラスにデフォルトのコンストラクターを提供します。
オブジェクトを作成するときは、少なくとも 1 つのコンストラクターを呼び出す必要があります。コンストラクターの名前はクラスと同じである必要があります。クラスには複数のコンストラクターを含めることができます。
コンストラクター メソッドの例を次に示します。
public class Puppy{ public Puppy(){ } public Puppy(String name){ // 这个构造器仅有一个参数:name } }
オブジェクトの作成
オブジェクトはクラスから作成されます。 Java では、キーワード new を使用して新しいオブジェクトを作成します。オブジェクトを作成するには、次の 3 つの手順が必要です。
宣言: オブジェクト名とオブジェクト タイプを含むオブジェクトを宣言します。
インスタンス化: キーワード new を使用してオブジェクトを作成します。
初期化: new を使用してオブジェクトを作成する場合、オブジェクトを初期化するためにコンストラクター メソッドが呼び出されます。
以下はオブジェクト作成の例です:
public class Puppy{ public Puppy(String name){ //这个构造器仅有一个参数:name System.out.println("Passed Name is :" + name ); } public static void main(String []args){ // 下面的语句将创建一个Puppy对象 Puppy myPuppy = new Puppy( "tommy" ); } }
上記のプログラムをコンパイルして実行すると、次の結果が表示されます:
Passed Name is :tommy
インスタンス変数とメソッドにアクセス
作成されたメソッドを通じてメンバー変数とメソッドにアクセス以下に示すオブジェクト メンバー メソッド:
/* 实例化对象 */ ObjectReference = new Constructor(); /* 访问其中的变量 */ ObjectReference.variableName; /* 访问类中的方法 */ ObjectReference.MethodName();
Instances
次の例は、インスタンス変数にアクセスしてメンバー メソッドを呼び出す方法を示しています:
public class Puppy{ int puppyAge; public Puppy(String name){ // 这个构造器仅有一个参数:name System.out.println("Passed Name is :" + name ); } public void setAge( int age ){ puppyAge = age; } public int getAge( ){ System.out.println("Puppy's age is :" + puppyAge ); return puppyAge; } public static void main(String []args){ /* 创建对象 */ Puppy myPuppy = new Puppy( "tommy" ); /* 通过方法来设定age */ myPuppy.setAge( 2 ); /* 调用另一个方法获取age */ myPuppy.getAge( ); /*你也可以像下面这样访问成员变量 */ System.out.println("Variable Value :" + myPuppy.puppyAge ); } }
上記のプログラムをコンパイルして実行すると、次の結果が生成されます:
Passed Name is :tommy Puppy's age is :2 Variable Value :2
ソース ファイル宣言ルール
このセクションの最後の部分では、ソースファイルの宣言ルールを学習します。ソース ファイル内で複数のクラスを定義する場合、および import ステートメントと package ステートメントがある場合は、これらの規則に特に注意してください。
ソース ファイル内に存在できる public クラスは 1 つだけです
ソース ファイルには複数の非パブリック クラスを含めることができます
ソース ファイルの名前は、パブリック クラスのクラス名と一致している必要があります。たとえば、ソース ファイル内のパブリック クラスのクラス名が Employee である場合、ソース ファイルの名前は Employee.java にする必要があります。
クラスがパッケージ内で定義されている場合、パッケージ ステートメントはソース ファイルの最初の行にある必要があります。
ソース ファイルにインポート ステートメントが含まれている場合は、それをパッケージ ステートメントとクラス定義の間に配置する必要があります。 package ステートメントがない場合は、import ステートメントがソース ファイルの最初にある必要があります。
import ステートメントと package ステートメントは、ソース ファイルで定義されているすべてのクラスに対して有効です。同じソース ファイル内で、異なるクラスに異なるパッケージ宣言を与えることはできません。
クラスにはいくつかのアクセスレベルがあり、クラスは抽象クラス、最終クラスなどのさまざまなタイプにも分類されます。これらについては、アクセス制御の章で説明します。
上記の型に加えて、Java には内部クラスや匿名クラスなどの特別なクラスもいくつかあります。
Java パッケージ
パッケージは主にクラスとインターフェースを分類するために使用されます。 Java プログラムを開発する場合、数百または数千のクラスを作成する場合があるため、クラスとインターフェイスを分類する必要があります。
Import ステートメント
Java では、パッケージ名とクラス名を含む完全な修飾名が指定されている場合、Java コンパイラーはソース コードまたはクラスを簡単に見つけることができます。 Import ステートメントは、コンパイラーが特定のクラスを見つけられるように、適切なパスを提供するために使用されます。
たとえば、次のコマンドラインは、java_installation/java/io パス内のすべてのクラスをロードするようにコンパイラーに指示します
import java.io.*;
簡単な例
この例では、Employee と EmployeeTest という 2 つのクラスを作成します。
まずテキストエディタを開いて、次のコードを貼り付けます。ファイルは Employee.java として保存されることに注意してください。
Employee クラスには、名前、年齢、役職、給与という 4 つのメンバー変数があります。このクラスは、パラメーターを 1 つだけ持つコンストラクター メソッドを明示的に宣言します。
import java.io.*; public class Employee{ String name; int age; String designation; double salary; // Employee 类的构造器 public Employee(String name){ this.name = name; } // 设置age的值 public void empAge(int empAge){ age = empAge; } /* 设置designation的值*/ public void empDesignation(String empDesig){ designation = empDesig; } /* 设置salary的值*/ public void empSalary(double empSalary){ salary = empSalary; } /* 打印信息 */ public void printEmployee(){ System.out.println("Name:"+ name ); System.out.println("Age:" + age ); System.out.println("Designation:" + designation ); System.out.println("Salary:" + salary); } }
プログラムはmainメソッドから実行を開始します。このプログラムを実行するには、main メソッドをインクルードし、インスタンス オブジェクトを作成する必要があります。
以下に EmployeeTest クラスを示します。これは、Employee クラスの 2 つのインスタンスをインスタンス化し、メソッドを呼び出して変数の値を設定します。
次のコードを EmployeeTest.java ファイルに保存します。
import java.io.*; public class EmployeeTest{ public static void main(String args[]){ /* 使用构造器创建两个对象 */ Employee empOne = new Employee("James Smith"); Employee empTwo = new Employee("Mary Anne"); // 调用这两个对象的成员方法 empOne.empAge(26); empOne.empDesignation("Senior Software Engineer"); empOne.empSalary(1000); empOne.printEmployee(); empTwo.empAge(21); empTwo.empDesignation("Software Engineer"); empTwo.empSalary(500); empTwo.printEmployee(); } }
これら 2 つのファイルをコンパイルし、EmployeeTest クラスを実行すると、次の結果が表示されます。