Java-object-classes
Java-オブジェクトとクラス
Javaはオブジェクト指向言語です。 オブジェクト指向機能を備えた言語として、Javaは以下の基本概念をサポートしています-
- 多型
- 継承
- カプセル化
- 抽象化
- クラス
- オブジェクト
- インスタンス
- 方法
- メッセージの受け渡し
この章では、概念-クラスとオブジェクト-を調べます。
- オブジェクト-オブジェクトには状態と動作があります。 例:犬には、色、名前、品種、行動などの状態があり、尾を振ったり、,えたり、食べたりします。 オブジェクトはクラスのインスタンスです。
- クラス-クラスは、そのタイプのオブジェクトがサポートする動作/状態を記述するテンプレート/設計図として定義できます。
Javaのオブジェクト
オブジェクトとは何かを詳しく見てみましょう。 現実の世界を考えると、私たちの周りには多くの物体、車、犬、人間などを見つけることができます。 これらすべてのオブジェクトには、状態と動作があります。
犬を考えると、その状態は-名前、品種、色、そして行動は-barえる、尻尾を振る、走るです。
ソフトウェアオブジェクトを実際のオブジェクトと比較すると、非常によく似た特性があります。
ソフトウェアオブジェクトには、状態と動作もあります。 ソフトウェアオブジェクトの状態はフィールドに格納され、動作はメソッドを介して表示されます。
そのため、ソフトウェア開発では、メソッドはオブジェクトの内部状態で動作し、オブジェクト間の通信はメソッドを介して行われます。
Javaのクラス
クラスは、個々のオブジェクトが作成される青写真です。
以下はクラスのサンプルです。
例
public class Dog {
String breed;
int age;
String color;
void barking() {
}
void hungry() {
}
void sleeping() {
}
}
クラスには、次の変数タイプのいずれかを含めることができます。
- ローカル変数-メソッド、コンストラクタ、またはブロック内で定義された変数はローカル変数と呼ばれます。 変数はメソッド内で宣言および初期化され、メソッドが完了すると変数は破棄されます。
- インスタンス変数-インスタンス変数は、クラス内のメソッドですが、メソッドの外部の変数です。 これらの変数は、クラスがインスタンス化されるときに初期化されます。 インスタンス変数は、その特定のクラスのメソッド、コンストラクター、またはブロック内からアクセスできます。
- クラス変数-クラス変数は、静的キーワードを使用して、メソッド内ではなくクラス内で宣言された変数です。
クラスには、さまざまな種類のメソッドの値にアクセスするための任意の数のメソッドを含めることができます。 上記の例では、barking()、hungry()、sleeping()がメソッドです。
以下は、Java言語のクラスを調べるときに議論する必要がある重要なトピックの一部です。
コンストラクタ
クラスについて議論するとき、最も重要なサブトピックの1つはコンストラクタです。 すべてのクラスにはコンストラクターがあります。 クラスのコンストラクターを明示的に記述しない場合、Javaコンパイラーはそのクラスのデフォルトコンストラクターを構築します。
新しいオブジェクトが作成されるたびに、少なくとも1つのコンストラクターが呼び出されます。 コンストラクターの主な規則は、コンストラクターがクラスと同じ名前を持つ必要があるということです。 クラスには複数のコンストラクターを含めることができます。
以下は、コンストラクタの例です-
例
public class Puppy {
public Puppy() {
}
public Puppy(String name) {
//This constructor has one parameter, name.
}
}
Javaは、シングルトン[シングルトンクラス]を使用してlink:/java/javaもサポートしています。この場合、クラスのインスタンスを1つだけ作成できます。
注-コンストラクタには2つの異なるタイプがあります。 コンストラクタについては、後続の章で詳しく説明します。
オブジェクトを作成する
前述のように、クラスはオブジェクトの青写真を提供します。 基本的に、オブジェクトはクラスから作成されます。 Javaでは、新しいキーワードを使用して新しいオブジェクトを作成します。
クラスからオブジェクトを作成する場合、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_ステートメント、および_package_ステートメントを宣言するときに不可欠です。
- ソースファイルごとにパブリッククラスは1つだけ存在できます。
- ソースファイルには、複数の非パブリッククラスを含めることができます。
- パブリッククラス名は、ソースファイルの名前である必要があり、最後に .java が追加されます。 たとえば、クラス名は_public class Employee \ {} _で、ソースファイルはEmployee.javaである必要があります。
- クラスがパッケージ内で定義されている場合、パッケージステートメントはソースファイルの最初のステートメントである必要があります。
- インポート文が存在する場合は、パッケージ文とクラス宣言の間に記述する必要があります。 パッケージ文がない場合は、インポート文をソースファイルの最初の行にする必要があります。
- インポートおよびパッケージステートメントは、ソースファイルに存在するすべてのクラスを意味します。 ソースファイルの異なるクラスに異なるインポートおよび/またはパッケージステートメントを宣言することはできません。
クラスには複数のアクセスレベルがあり、さまざまなタイプのクラスがあります。抽象クラス、最終クラスなど これらすべてについては、アクセス修飾子の章で説明します。
上記のタイプのクラスとは別に、Javaには内部クラスおよび匿名クラスと呼ばれる特別なクラスもあります。
Javaパッケージ
簡単に言えば、クラスとインターフェースを分類する方法です。 Javaでアプリケーションを開発する場合、数百のクラスとインターフェースが作成されます。したがって、これらのクラスを分類することは必須であり、生活をずっと楽にします。
インポート文
Javaでは、パッケージとクラス名を含む完全修飾名が指定されている場合、コンパイラはソースコードまたはクラスを簡単に見つけることができます。 importステートメントは、コンパイラがその特定のクラスを見つけるための適切な場所を提供する方法です。
たとえば、次の行はコンパイラにディレクトリjava_installation/java/ioで利用可能なすべてのクラスをロードするように要求します-
import java.io.*;
簡単なケーススタディ
このケーススタディでは、2つのクラスを作成します。 それらはEmployeeとEmployeeTestです。
最初にメモ帳を開き、次のコードを追加します。 これはEmployeeクラスであり、クラスはパブリッククラスであることを忘れないでください。 次に、このソースファイルを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クラスを実行するには、メインメソッドとオブジェクトを作成する必要があります。 これらのタスク用に個別のクラスを作成します。
以下は_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アプリケーションを開発するときにそれらを使用する方法について説明します。