Java オブジェクトとクラス

Javaはオブジェクト指向プログラミング言語として、以下の基本概念をサポートしています:

1、クラス(Class):

  • オブジェクトの設計図であり、属性とメソッドを含みます。
  • 例:public class Car { ... }

2、オブジェクト(Object):

  • クラスのインスタンスであり、状態と振る舞いを持ちます。
  • 例:Car myCar = new Car();

3、継承(Inheritance):

  • あるクラスは別のクラスの属性とメソッドを継承できます。
  • 例:public class Dog extends Animal { ... }

4、カプセル化(Encapsulation):

  • オブジェクトの状態(フィールド)をプライベートにし、パブリックメソッドを介してアクセスします。
  • 例:
    private String name; 
    public String getName() { return name; }

5、ポリモーフィズム(Polymorphism):

  • オブジェクトは複数の形態をとることができ、主にメソッドのオーバーロードとオーバーライドによって実現されます。
  • 例:
    • メソッドのオーバーロード:public int add(int a, int b) { ... }とpublic double add(double a, double b) { ... }
    • メソッドのオーバーライド:@Override public void makeSound() { System.out.println("Meow"); }

6、抽象化(Abstraction):

  • 抽象クラスとインターフェースを使用して、実装が必要なメソッドを定義し、具体的な実装は提供しません。
  • 例:
    • 抽象クラス:public abstract class Shape { abstract void draw(); }
    • インターフェース:public interface Animal { void eat(); }

7、インターフェース(Interface):

  • クラスが実装しなければならないメソッドを定義し、多重継承をサポートします。
  • 例:public interface Drivable { void drive(); }

8、メソッド(Method):

  • クラスの振る舞いを定義し、クラス内に含まれる関数です。
  • 例:public void displayInfo() { System.out.println("Info"); }

9、メソッドのオーバーロード(Method Overloading):

  • 同じクラス内に同じ名前のメソッドを複数持つことができますが、引数が異なります。
  • 例:
    public class MathUtils {
        public int add(int a, int b) {
            return a + b;
        }
    
        public double add(double a, double b) {
            return a + b;
        }
    }
    

このセクションでは、オブジェクトとクラスの概念に焦点を当てます。

  • オブジェクト:オブジェクトはクラスのインスタンスです(オブジェクトは彼女を見つけることではありません)、状態と振る舞いを持ちます。例えば、犬はオブジェクトであり、その状態には色、名前、品種があり、振る舞いには尻尾を振る、吠える、食べるなどがあります。
  • 类:クラスはテンプレートであり、ある種類のオブジェクトの振る舞いと状態を記述します。

下の図では男の子(boy)、女の子(girl)ためにクラス(class)、具体的な各人はそのクラスのオブジェクト(object)です。:

下の図では自動車ためにクラス(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(){ } }

クラスには以下のタイプの変数を含めることができます:

  • ローカル変数:メソッド、コンストラクタ、またはステートメントブロック内で定義される変数はローカル変数と呼ばれます。変数の宣言と初期化はすべてメソッド内で行われ、メソッドが終了すると変数は自動的に破棄されます。
  • メンバー変数:メンバー変数はクラス内でメソッド本体の外に定義される変数です。この変数はオブジェクトの作成時にインスタンス化されます。メンバー変数はクラスのメソッド、コンストラクタ、および特定のクラスのステートメントブロックからアクセスできます。
  • クラス変数:クラス変数もクラス内でメソッド本体の外に宣言されますが、static型として宣言する必要があります。

クラスは複数のメソッドを持つことができます。上の例では、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();

Object型を使用して変数を宣言すると、コンパイル時にはObjectクラスのメソッドとプロパティにのみアクセスできますが、実行時にはキャスト(強制型変換)によって特定の型に変換し、特定の型のメソッドとプロパティにアクセスできます。


例

以下の例は、インスタンス変数にアクセスしメンバーメソッドを呼び出す方法を示しています:

Puppy.java ファイルコード:

public class Puppy { private int age; private String name; //コンストラクタ public Puppy(String name) { this.name = name; System.out.println("子犬の名前は :" + name); } //ageの値を設定します public void setAge(int age) { this.age = age; } //ageの値を取得します public int getAge() { return age; } //nameの値を取得します public String getName() { return name; } //メインメソッド public static void main(String[] args) { //オブジェクトの作成 Puppy myPuppy = new Puppy("Tommy"); //メソッドを使ってageを設定します myPuppy.setAge(2); //別のメソッドを呼び出してageを取得します int age = myPuppy.getAge(); System.out.println("子犬の年齢は :" + age); //メンバー変数に直接アクセスすることもできます(getterメソッド経由) System.out.println("変数の値 :" + myPuppy.getAge()); } }

上記のプログラムをコンパイルして実行すると、次の結果が得られます:

小狗的名字是 : tommy
小狗的年龄为 : 2
变量值 : 2

ソースファイルの宣言規則

このセクションの最後に、ソースファイルの宣言規則を学びます。1つのソースファイルに複数のクラスを定義し、さらにimport文とpackage文がある場合は、これらの規則に特に注意する必要があります。

  • 1つのソースファイルにはpublicクラスを1つだけ持つことができます。
  • 1つのソースファイルには複数の非publicクラスを持つことができます。
  • ソースファイルの名前はpublicクラスのクラス名と一致させる必要があります。例えば、ソースファイル内のpublicクラスのクラス名がEmployeeの場合、ソースファイルはEmployee.javaという名前にする必要があります。
  • クラスがパッケージ内に定義されている場合、package文はソースファイルの先頭行に置く必要があります。
  • ソースファイルにimport文が含まれる場合、package文とクラス定義の間に置く必要があります。package文がない場合、import文はソースファイルの先頭に置く必要があります。
  • import文とpackage文は、ソースファイル内で定義されたすべてのクラスに有効です。同じソースファイル内で、異なるクラスに異なるパッケージ宣言をすることはできません。

クラスにはいくつかのアクセスレベルがあり、クラスには抽象クラスやfinalクラスなどの異なるタイプもあります。これらはアクセス制御の章で説明します。

上記で述べたタイプの他に、Javaにはいくつかの特別なクラスもあります。例えば:内部クラス、匿名クラス。


Java パッケージ

パッケージは主にクラスとインターフェースを分類するために使用します。Javaプログラムを開発するとき、何百、何千ものクラスを書く可能性があるため、クラスとインターフェースを分類することが非常に必要です。

import 文

Javaでは、完全修飾名(パッケージ名、クラス名を含む)が与えられれば、Javaコンパイラはソースコードまたはクラスを簡単に特定できます。import文は、コンパイラが特定のクラスを見つけられるように、適切なパスを提供するために使用します。

例えば、次のコマンドラインはコンパイラに java_installation/java/io パス配下のすべてのクラスをロードするよう指示します。

import java.io.*;

簡単な例

この例では、2つのクラスを作成します。EmployeeとEmployeeTest。

まずコードエディタを開き、次のコードを貼り付けて、ファイルを保存します。Employee.java。

Employee クラスには4つのメンバー変数(name、age、designation、salary)があります。このクラスは、1つのパラメータのみを持つコンストラクタを明示的に宣言しています。

Employee.java ファイルコード:

import java.io.*; public class Employee { private String name; private int age; private String designation; private double salary; //Employee クラスのコンストラクタ public Employee(String name) { this.name = name; } //age の値を設定 public void setAge(int age) { this.age = age; } //age の値を取得 public int getAge() { return age; } //designation の値を設定 public void setDesignation(String designation) { this.designation = designation; } //designation の値を取得 public String getDesignation() { return designation; } //salary の値を設定 public void setSalary(double salary) { this.salary = salary; } //salary の値を取得 public double getSalary() { return salary; } //情報を出力 public void printEmployee() { System.out.println(this); } //toString メソッドをオーバーライド @Override public String toString() { return "名前:" + name + "\n" + "年齢:" + age + "\n" + "役職:" + designation + "\n" + "給与:" + salary; } }

Java プログラムはすべて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("サンプル1"); Employee empTwo = new Employee("サンプル2"); //これら2つのオブジェクトのメンバーメソッドを呼び出す empOne.setAge(26); empOne.setDesignation("上級プログラマー"); empOne.setSalary(1000); empOne.printEmployee(); empTwo.setAge(21); empTwo.setDesignation("初心者プログラマー"); empTwo.setSalary(500); empTwo.printEmployee(); } }

これら2つのファイルをコンパイルして EmployeeTest クラスを実行すると、次の結果が表示されます。

$ javac EmployeeTest.java Employee.java
$ java EmployeeTest 
名字:サンプル1
年龄:26
职位:高级程序员
薪水:1000.0
名字:サンプル2
年龄:21
职位:サンプル程序员
薪水:500.0
その他の拡張