Javaはオブジェクト指向言語です。下記の基本的な概念をサポートします。
- ポリモーフィズム
- 継承
- パッケージ
- 抽象
- クラス
- オブジェクト
- インスタンス
- メソッド
- オーバーロード
この記事では、オブジェクトとクラスの概念について説明します。
- オブジェクト:オブジェクトは、状態と動作を備えたクラスのインスタンスです。例えば、犬はオブジェクトであり、その状態には、色、名前、犬種があり、行動には尻尾を振る、吠える、食べるなどが含まれます。
- クラス:クラスは、オブジェクトのクラスの動作と状態を説明するテンプレートです。
次の写真では、男性と女性がクラス(class)であり、具体的な個人がそのクラスのオブジェクトです。
下記の写真にある車はクラス(class)であり、具体的な車は車クラスのオブジェクト(object)です。オブジェクトには、車の色、ブランド、名前などが含まれます。
目次
Javaのオブジェクト
次には、オブジェクトとは何かを理解しましょう。 周りを見ると、たくさんのオブジェクト、車、犬、人などがいます。これらのオブジェクトにはすべて、独自の状態と動作があります。
例えば、犬の状態には、名前、品種、色があり、動作には吠える、尻尾を振る、走るが含まれます。
実際のオブジェクトとソフトウェアのオブジェクトを比較すると、それらは非常に似ています。
ソフトウェアのオブジェクトにも状態と動作があります。 ソフトウェアオブジェクトの状態は属性であり、動作はメソッドから反映されます。
ソフトウェアの開発では、メソッドはオブジェクトの内部状態の変化を操作し、オブジェクト間の呼び出しもメソッドによって実行します。
Javaのクラス
クラスは、Javaオブジェクトを作成するためのテンプレートとして認められます。
上記の写真からシンプルなクラスを作成して、Javaでのクラスの定義を理解します。
public class Dog {
String breed;
int size;
String colour;
int age;
void eat() {
}
void run() {
}
void sleep(){
}
void name(){
}
}
クラスには、下記の型の変数を含めることができます。
- ローカル変数:メソッド、コンストラクタ、またはステートメントブロックで定義された変数は、ローカル変数と呼ばれます。 変数の宣言と初期化はメソッド内にあります。メソッドが終了すると、変数は自動的に破棄されます。
- メンバー変数:メンバー変数は、メソッド本体の外部のクラスで定義された変数です。この変数は、オブジェクトの作成時にインスタンス化されます。 メンバー変数には、クラスメソッド、コンストラクタ、および特定のクラスステートメントブロックからアクセスできます。
- クラス変数:クラス変数は、クラス内やメソッドの外部に宣言されますが、静的型として宣言する必要があります。
クラスには複数のメソッドを含むことができます。上記の例では、eat()、run()、sleep() と name() はすべてDogクラスのメソッドです。
コンストラクタ
すべてのクラスにはコンストラクタがあります。クラスのコンストラクタを明示的に定義していない場合、Javaコンパイラはクラスのデフォルトコンストラクタを提供します。
オブジェクトを作成する場合、少なくとも1つのコンストラクタを呼び出す必要があります。 コンストラクタ名はクラス名と同じである必要があり、クラスには複数のコンストラクタを含めることができます。
下記は、コンストラクタの例です。
public class Puppy{
public Puppy(){
}
public Puppy(String name){
// このコンストラクタにあるパラメータは1つだけです:name
}
}
オブジェクトを作成する
オブジェクトはクラスに基づいて作成されます。 Javaでは、キーワードnewを使用して新しいオブジェクトを作成します。オブジェクトを作成するには、次の3つのステップが必要です。
- 宣言:オブジェクトを宣言します。オブジェクト名とオブジェクトの型を含めます。
- インスタンス化:キーワードnewを使用してオブジェクトを作成します。
- 初期化:newを使用してオブジェクトを作成する場合、コンストラクタが呼び出されてオブジェクトが初期化されます。
次には、オブジェクトを作する例を挙げます。
public class Puppy{
public Puppy(String name){
//このコンストラクタにあるパラメータは1つだけです:name
System.out.println("犬の名前 : " + name );
}
public static void main(String[] args){
// 次のステートメントは、Puppyオブジェクトを作成します
Puppy myPuppy = new Puppy( "tommy" );
}
}
上記のプログラムをコンパイルして実行すると、下記の結果が出力されます。
犬の名前 :tommy
インスタンス変数とメソッドにアクセスする
作成されたオブジェクトによってメンバー変数とメンバーメソッドにアクセスします。
/* インスタンス化 */
Object referenceVariable = new Constructor();
/* クラス内の変数にアクセスする */
referenceVariable.variableName;
/* クラス内のメソッドにアクセスする */
referenceVariable.methodName();
実例
次の例では、インスタンス変数にアクセスする方法とメンバーメソッドを呼び出す方法を示しています。
public class Puppy{
int puppyAge;
public Puppy(String name){
// このコンストラクタにはパラメータが1つしかない:name
System.out.println("犬の名前 : " + name );
}
public void setAge( int age ){
puppyAge = age;
}
public int getAge( ){
System.out.println("犬の年齢 : " + puppyAge );
return puppyAge;
}
public static void main(String[] args){
/* オブジェクトを作成する */
Puppy myPuppy = new Puppy( "tommy" );
/* メソッドによってageを設定する */
myPuppy.setAge( 2 );
/* 別のメソッドを呼び出してageを取得する */
myPuppy.getAge( );
/*次のようにメンバー変数にアクセスできる */
System.out.println("変数値 : " + myPuppy.puppyAge );
}
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます。
犬の名前 : tommy
犬の年齢 : 2
変数値 : 2
ソースファイルの宣言ルール
この記事の最後の部分では、ソースファイルの宣言ルールについて学習します。 ソースファイルで複数のクラスを定義し、importステートメントとpackageステートメントもある場合、これらのルールに特に注意するべきです。
- ソースファイルにはpublicクラスを1つだけ含めることができます
- ソースファイルには、複数のprivateクラスを含めることができます
- ソースファイルの名前は、publicクラスのクラス名と一致する必要があります。例えば、ソースファイルのpublicクラスのクラス名がEmployeeの場合、ソースファイルの名前はEmployee.javaにする必要があります。
- クラスがあるパッケージに定義されている場合、packageステートメントはソースファイルの1行目にする必要があります。
- ソースファイルにimportステートメントが含まれている場合は、packageステートメントとクラス定義の間に配置する必要があります。 packageステートメントがない場合、importステートメントをソースファイルの最初に配置する必要があります。
- importステートメントとpackageステートメントは、ソースファイルで定義されているすべてのクラスに有効です。 同じソースファイル内には、異なるクラスに対して異なるパッケージを宣言できません。
クラスにはいくつかのアクセスレベルがあり、クラスも抽象クラスとfinalクラスなどさまざまなタイプに分けられます。これらは、アクセス制御の記事に説明します。
上記のタイプ以外、Javaには、内部クラスや匿名クラスなど、いくつかの特別なクラスもあります。
Javaパッケージ
パッケージは、主にクラスとインターフェイスを分類するために使用されます。 Javaプログラムを開発する場合、何千のクラスが作成される可能性があるため、クラスとインターフェースを分類する必要があります。
importステートメント
Javaでは、パッケージ名とクラス名を含む完全修飾名が指定されている場合、Javaコンパイラはソースコードまたはクラスを簡単に見つけることができます。 importステートメントは、コンパイラが特定のクラスを見つけることができるように、適切なパスを提供するために使用されます。
例えば、次のコマンドラインは、コンパイラにjava_installation/java/io
パス内のすべてのクラスをロードするように指示します。
import java.io.*;
実例
この実例では、Employee
とEmployeeTest
の2つのクラスを作成します。
まずテキストエディタを開き、下記のコードをテキストエディタに貼り付けます。ファイルはEmployee.javaとして保存します。
Employeeクラスには、name、age、designation と salary、4つのメンバー変数があります。このクラスはコンストラクタを明示的に宣言し、1つのパラメータしかありません。
Employee.java ファイルコード:
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 );
System.out.println("年齢:" + age );
System.out.println("職位:" + designation );
System.out.println("給与:" + salary);
}
}
プログラムはmainメソッドから実行されます。このプログラムを実行するには、mainメソッドを含み、インスタンスオブジェクトを作成する必要があります。
下記の実例はEmployeeTestクラスで、Employeeクラスの2つのインスタンスをインスタンス化し、メソッドを呼び出して変数の値を設定します。
次のコードをEmployeeTest.javaファイルに保存します。
EmployeeTest.java ファイルコード:
import java.io.*;
public class EmployeeTest{
public static void main(String[] args){
/* コンストラクタを使用して2つのオブジェクトを作成する */
Employee empOne = new Employee("RUNOOB1");
Employee empTwo = new Employee("RUNOOB2");
// これら2つのオブジェクトのメンバーメソッドを呼び出す
empOne.empAge(26);
empOne.empDesignation("プロプログラマ");
empOne.empSalary(1000);
empOne.printEmployee();
empTwo.empAge(21);
empTwo.empDesignation("新人プログラマ");
empTwo.empSalary(500);
empTwo.printEmployee();
}
}
これらの2つのファイルをコンパイルし、EmployeeTestクラスを実行すると、次の結果が取得できます。
$ javac EmployeeTest.java
$ java EmployeeTest
名前:RUNOOB1
年齢:26
職位:プロプログラマ
給与:1000.0
名前:RUNOOB2
年齢:21
職位:新人プログラマ
給与:500.0
コメントを残す