Javaオブジェクトとクラス

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.*;

実例

この実例では、EmployeeEmployeeTestの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
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です