Java - オブジェクトとクラス
Java はオブジェクト指向言語です。オブジェクト指向機能を持つ言語として、Java は次の基本的な概念をサポートします −
- ポリモーフィズム
- 継承
- カプセル化
- 抽象化
- クラス
- オブジェクト
- インスタンス
- 方法
- メッセージの受け渡し
この章では、クラスとオブジェクトという概念について説明します。
- <リ>
オブジェクト − オブジェクトには状態と動作があります。例:犬には状態 (色、名前、品種、行動) があります。しっぽを振る、吠える、食べるなどです。オブジェクトはクラスのインスタンスです。
<リ>クラス − クラスは、そのタイプのオブジェクトがサポートする動作/状態を記述するテンプレート/ブループリントとして定義できます。
Java のオブジェクト
オブジェクトとは何かを深く見てみましょう。現実世界を考えると、車、犬、人間など、私たちの周りには多くの物体があります。これらの物体はすべて、状態と動作を持っています。
犬を例にとると、その状態は名前、品種、色、行動は吠える、尻尾を振る、走るなどです。
ソフトウェア オブジェクトを現実世界のオブジェクトと比較すると、非常によく似た特徴があります。
ソフトウェア オブジェクトにも状態と動作があります。ソフトウェア オブジェクトの状態はフィールドに格納され、動作はメソッドを介して表示されます。
したがって、ソフトウェア開発では、メソッドはオブジェクトの内部状態で動作し、オブジェクト間の通信はメソッドを介して行われます。
Java のクラス
クラスは、個々のオブジェクトが作成される青写真です。
以下はクラスのサンプルです。
例
public class Dog {
String breed;
int age;
String color;
void barking() {
}
void hungry() {
}
void sleeping() {
}
}
クラスには、次の変数タイプのいずれかを含めることができます。
- <リ>
ローカル変数 − メソッド、コンストラクタ、またはブロック内で定義された変数は、ローカル変数と呼ばれます。変数はメソッド内で宣言および初期化され、メソッドが完了すると変数は破棄されます。
<リ>インスタンス変数 - インスタンス変数は、クラス内の変数ですが、どのメソッドの外部にもありません。これらの変数は、クラスがインスタンス化されるときに初期化されます。インスタンス変数は、その特定のクラスの任意のメソッド、コンストラクター、またはブロック内からアクセスできます。
<リ>クラス変数 − クラス変数は、static キーワードを使用して、メソッドの外部でクラス内で宣言された変数です。
クラスは、さまざまな種類のメソッドの値にアクセスするためのメソッドをいくつでも持つことができます。上記の例では、barking()、hungry()、sleep() がメソッドです。
以下は、Java 言語のクラスを検討する際に検討する必要がある重要なトピックの一部です。
コンストラクタ
クラスについて議論するとき、最も重要なサブトピックの 1 つはコンストラクターです。すべてのクラスにはコンストラクターがあります。クラスのコンストラクターを明示的に記述しない場合、Java コンパイラーはそのクラスのデフォルトのコンストラクターを構築します。
新しいオブジェクトが作成されるたびに、少なくとも 1 つのコンストラクターが呼び出されます。コンストラクターの主なルールは、クラスと同じ名前にすることです。クラスは複数のコンストラクターを持つことができます。
以下はコンストラクタの例です-
例
public class Puppy {
public Puppy() {
}
public Puppy(String name) {
// This constructor has one parameter, name.
}
}
Java は、クラスのインスタンスを 1 つだけ作成できるシングルトン クラスもサポートしています。
注意 - 2 つの異なるタイプのコンストラクターがあります。コンストラクターについては、以降の章で詳しく説明します。
オブジェクトの作成
前述のように、クラスはオブジェクトの設計図を提供します。基本的に、オブジェクトはクラスから作成されます。 Java では、new キーワードを使用して新しいオブジェクトを作成します。
クラスからオブジェクトを作成するには、3 つのステップがあります −
- <リ>
宣言 − オブジェクト型の変数名を持つ変数宣言。
<リ>インスタンス化 − オブジェクトの作成には「new」キーワードが使用されます。
<リ>初期化 − 'new' キーワードの後にコンストラクターの呼び出しが続きます。この呼び出しは新しいオブジェクトを初期化します。
以下は、オブジェクトを作成する例です −
例
ライブデモ
public class Puppy {
public Puppy(String name) {
// This constructor has one parameter, name.
System.out.println("Passed Name is :" + name );
}
public static void main(String []args) {
// Following statement would create an object myPuppy
Puppy myPuppy = new Puppy( "tommy" );
}
}
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
出力
Passed Name is :tommy
インスタンス変数とメソッドへのアクセス
インスタンス変数とメソッドは、作成されたオブジェクトを介してアクセスされます。インスタンス変数にアクセスするには、完全修飾パスを次に示します-
/* First create an object */ ObjectReference = new Constructor(); /* Now call a variable as follows */ ObjectReference.variableName; /* Now you can call a class method as follows */ ObjectReference.MethodName();
例
この例では、クラスのインスタンス変数とメソッドにアクセスする方法を説明します。
ライブデモ
public class Puppy {
int puppyAge;
public Puppy(String name) {
// This constructor has one parameter, name.
System.out.println("Name chosen 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) {
/* Object creation */
Puppy myPuppy = new Puppy( "tommy" );
/* Call class method to set puppy's age */
myPuppy.setAge( 2 );
/* Call another class method to get puppy's age */
myPuppy.getAge( );
/* You can access instance variable as follows as well */
System.out.println("Variable Value :" + myPuppy.puppyAge );
}
}
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
出力
Name chosen is :tommy Puppy's age is :2 Variable Value :2
ソース ファイルの宣言規則
このセクションの最後の部分として、ソース ファイルの宣言規則を見てみましょう。クラス、import を宣言するとき、これらの規則は不可欠です。 ステートメントとパッケージ ソース ファイル内のステートメント。
- <リ>
ソース ファイルごとに 1 つのパブリック クラスしか存在できません。
<リ>ソース ファイルには、複数の非パブリック クラスを含めることができます。
<リ>パブリック クラス名はソース ファイルの名前である必要があり、.java で追加する必要があります 最後に。例:クラス名は public class Employee{} です。 その場合、ソース ファイルは Employee.java である必要があります。
<リ>クラスがパッケージ内で定義されている場合、package ステートメントはソース ファイルの最初のステートメントである必要があります。
<リ>import ステートメントが存在する場合は、package ステートメントとクラス宣言の間に記述する必要があります。パッケージ ステートメントがない場合、インポート ステートメントはソース ファイルの最初の行にある必要があります。
<リ>import および package ステートメントは、ソース ファイルに存在するすべてのクラスを意味します。ソース ファイル内の異なるクラスに対して異なる import および/または package ステートメントを宣言することはできません。
クラスにはいくつかのアクセス レベルがあり、さまざまな種類のクラスがあります。抽象クラス、最終クラスなど。これらすべてについては、アクセス修飾子の章で説明します。
上記の種類のクラスとは別に、Java には内部クラスと匿名クラスと呼ばれる特別なクラスもあります。
Java パッケージ
簡単に言えば、クラスとインターフェースを分類する方法です。 Java でアプリケーションを開発する場合、何百ものクラスとインターフェースが作成されるため、これらのクラスを分類することは必須であり、作業がずっと楽になります。
インポートステートメント
Java では、パッケージとクラス名を含む完全修飾名が指定されている場合、コンパイラはソース コードまたはクラスを簡単に見つけることができます。 import ステートメントは、コンパイラが特定のクラスを見つけるための適切な場所を提供する方法です。
たとえば、次の行は、ディレクトリ java_installation/java/io で利用可能なすべてのクラスをロードするようにコンパイラに要求します −
import java.io.*;
簡単なケーススタディ
このケース スタディでは、2 つのクラスを作成します。 Employee と EmployeeTest です。
最初にメモ帳を開き、次のコードを追加します。これは Employee クラスであり、このクラスは public クラスであることを思い出してください。次に、このソース ファイルを Employee.java という名前で保存します。
Employee クラスには、名前、年齢、役職、給与の 4 つのインスタンス変数があります。このクラスには、パラメーターを受け取る明示的に定義されたコンストラクターが 1 つあります。
例
import java.io.*;
public class Employee {
String name;
int age;
String designation;
double salary;
// This is the constructor of the class Employee
public Employee(String name) {
this.name = name;
}
// Assign the age of the Employee to the variable age.
public void empAge(int empAge) {
age = empAge;
}
/* Assign the designation to the variable designation.*/
public void empDesignation(String empDesig) {
designation = empDesig;
}
/* Assign the salary to the variable salary.*/
public void empSalary(double empSalary) {
salary = empSalary;
}
/* Print the Employee details */
public void printEmployee() {
System.out.println("Name:"+ name );
System.out.println("Age:" + age );
System.out.println("Designation:" + designation );
System.out.println("Salary:" + salary);
}
}
このチュートリアルで前述したように、処理は main メソッドから開始されます。したがって、この Employee クラスを実行するには、main メソッドとオブジェクトを作成する必要があります。これらのタスク用に別のクラスを作成します。
以下は EmployeeTest です クラス Employee の 2 つのインスタンスを作成し、各オブジェクトのメソッドを呼び出して各変数に値を割り当てます。
次のコードを EmployeeTest.java ファイルに保存します。
import java.io.*;
public class EmployeeTest {
public static void main(String args[]) {
/* Create two objects using constructor */
Employee empOne = new Employee("James Smith");
Employee empTwo = new Employee("Mary Anne");
// Invoking methods for each object created
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();
}
}
両方のクラスをコンパイルして、EmployeeTest を実行します。 次のように結果を確認するには −
出力
C:\> javac Employee.java C:\> javac EmployeeTest.java C:\> java EmployeeTest Name:James Smith Age:26 Designation:Senior Software Engineer Salary:1000.0 Name:Mary Anne Age:21 Designation:Software Engineer Salary:500.0
次は?
次のセッションでは、Java の基本的なデータ型と、Java アプリケーションの開発時にそれらを使用する方法について説明します。
Java