はじめに
この実験では、非常に重要なプログラミングパターンであるオブジェクト指向プログラミング(object-oriented-programming)について学びます。クラス(class)とオブジェクト(object)の違いを理解する必要があります。より深く理解するために、多くの練習を行ってください。
この実験では、非常に重要なプログラミングパターンであるオブジェクト指向プログラミング(object-oriented-programming)について学びます。クラス(class)とオブジェクト(object)の違いを理解する必要があります。より深く理解するために、多くの練習を行ってください。
多くのプログラミング言語が存在し、それとほぼ同じ数のプログラミングスタイル(時にはパラダイムと呼ばれます)があります。これまでに書いたプログラムは主に手続き型で、計算手順の指定に重点が置かれていました。ほとんどの Java プログラムはオブジェクト指向で、これはオブジェクトとその相互作用に焦点が当てられていることを意味します。以下はオブジェクト指向プログラミングのいくつかの特徴です。
オブジェクトはしばしば現実世界のエンティティを表します。ほとんどのメソッドはオブジェクトメソッド(String
で呼び出すメソッドのようなもの)であり、クラスメソッド(Math
のメソッドのようなもの)ではありません。これまでに書いたメソッドはクラスメソッドでした。この章では、いくつかのオブジェクトメソッドを書きます。
オブジェクトは、相互作用の方法を制限することで、特にメソッドを呼び出さずにインスタンス変数にアクセスすることを防ぐことで、互いに分離されています。クラスは、新しいクラスが既存のクラスを拡張し、新しいメソッドを追加したり他のメソッドを置き換えたりする家族の木(クラス階層)で組織されています。
Java では、Object
クラスを除くすべてのクラスは、他のクラスを拡張しています。最も基本的なクラスは Object
クラスです。このクラスにはインスタンス変数が含まれていませんが、equals
や toString
などのメソッドを提供しています。
多くのクラスが Object
を拡張しており、これにはこれまでに書いたほとんどすべてのクラスや、Integer
、Double
、String
、配列などの多くの Java の 型(types) が含まれます。明示的に親クラスを指定しないクラスは、デフォルトで Object
を拡張します。クラスの「家族の木」は クラス階層(class hierarchy) と呼ばれます。Object
は通常最上位に位置し、その下にすべての 子クラス(child classes) があります。
クラスとオブジェクトには通常、それらを説明するために使用されるいくつかの属性があり、メソッドは特定の機能を実行するために使用されます。ここでは、クラスがどのようなものかを示す例を紹介します。コードを objectTest.java
に保存し、コマンドラインでコードを実行してください。
例:
以下のコードを /home/labex/project/objectTest.java
ファイルに書きます。
// use keyword 'class' to create a new class named Person
class Person
{
/*
* there are four properties,
* name of string type, age of int type
* gender of string type, weight of float type
*/
private String name;
private int age;
private String gender;
private float weight;
// this is a constructor with no return type, the same name as the class, no parameters
public Person(){
}
//this is a constructor with two parameters
public Person(String name, int age){
// use parameters to set object's name and age
this.name = name;
this.age = age;
}
// this is a constructor with four parameters
public Person(String name, int age, String gender, float weight){
// use parameters to set object's name, age, gender and weight
this.name = name;
this.age = age;
this.gender = gender;
this.weight = weight;
}
// this is an object method
public void personInfo(){
System.out.println("Name: " + this.name + "\nAge: "+ this.age + "\nGender: " + this.gender + "\nWeight: "+this.weight);
}
}
public class objectTest{
public static void main(String[] args){
// use 'new' to create an instance of class Person
Person p = new Person("aaa",18,"male",50.5f); // p refers to an object
/* you can try these two different construction methods, and see what the output is.
* Person p = new Person();
* Person p = new Person("aaa",18);
*/
// use object to invoke method personInfo()
p.personInfo();
}
}
出力:
以下のコマンドを使用して objectTest.java
ファイルを実行します。
javac /home/labex/project/objectTest.java
java objectTest
出力を確認します。
Name: aaa
Age: 18
Gender: male
Weight: 50.5
Person
クラスには 4 つの属性があります。すべての属性は private であるため、外部からアクセスすることはできません(クラス内部でのみ使用できます)。個人情報を印刷するための personInfo
という名前のオブジェクトメソッドが 1 つあり、クラス名 Person
と同じ名前のコンストラクタが 3 つあります。これらのコンストラクタの唯一の違いはパラメータです。このような動作を オーバーロード(overloading) と呼びます。
この部分は非常に重要です。クラス(class)は共通の特徴を持つエンティティの抽象化であり、オブジェクト(object)は特定の特徴を持つエンティティです。上記のプログラミングスタイルを理解するために、もっと時間をかけるべきです。