オブジェクト指向の概要　クラス・インスタンスの生成　振る舞いの定義

Java勉強中です。勉強したことをまとめてます！

#オブジェクト指向の概要
人が行なっている作業をシステム化する際、人や作業をオブジェクトとみなし、オブジェクト毎にシステム上で再現する事によって、システム開発をする人にとっても、分かり易いシステムを作成しようという考え方。

#オブジェクト指向の３大機能
・カプセル化：ある特定の相手からの、操作や変更を禁止する事
・継承：過去に作成した部品を参考に、新しい部品を作成する事
・多様性：似ている２つの部品を、同じ様なものとして、曖昧性を持たせて同様の扱いが出来る事。

#クラス・インスタンスの生成について
　
##クラスの作成について

**（考え方）**
・クラス名＝ファイル名
・クラスでは対象物の**属性・振る舞い**を定義する。

**（例〜StCharaクラスを作成する場合〜）**

```java

public class StChara {
	String name;//属性
	int focelevel;//属性
	String status;//属性

	void selfIndroduction() {//振る舞い
		System.out.println("私の名前は" + this.name);
		System.out.println("フォースレベルは" + this.focelevel);
		System.out.println("ステータスは" + this.status);
	}
}
```

##属性の定義

**（考え方）**

クラス内で変数を定義する事で、属性を定義する。

**（例）**

```java

public class StChara {
	String name;//名前属性
	int focelevel;//フォースレベル属性
	String status;//ステータス属性
```

**（フィールドについて）**
クラスブロック内で定義した変数 = **フィールド**となる。
上記例の中では、以下の`name` `focelevel` `status`がそれぞれフィールドに該当する。



**（定数フィールドについて）**
フィールドの先頭に`final`を付けることで、変更出来ないフィールドにする事が出来る。
これを**定数フィールド** という。
定数フィールドの場合、変数名を大文字に設定する。

```
final int FOCELEVEL = 100;
```


##振る舞いの定義
**（考え方）**
振る舞いはメソッドを使って、定義する。

**（例）**

```java
	void selfIndroduction() {//自己紹介の振る舞い
		System.out.println("私の名前は" + this.name);
		System.out.println("フォースレベルは" + this.focelevel);
		System.out.println("ステータスは" + this.status);
	}	
```
**（補足）**
this.変数名は**自分自身のインスタンス上の変数である**ことを示している。

##クラス変数・インスタンスの生成について

**（考え方）**
クラスを定義する事で、その**クラスの属性・操作に対応した**クラス変数が使用出来る様になる。
**クラス変数にインスタンスを代入する事で、インスタンスを生成する**。

**(クラス変数の作成方法)**

```java
クラス名 クラス変数名;
```

**(インスタンスの生成方法)**

```java
クラス名 クラス変数名　= new クラス名();
```

**（例）**※同時に実施する場合

```java

StChara dath/*②*/ = new StChara();/*①*/            
```

**（補足）**
①右辺にて、`StChara`インスタンスを生成。
②左辺にて`StChara`というクラスを用いて、`dath`という**クラス変数を作成**。そこに①にて生成した、`StChara`インスタンスを代入している。
③`dath`というクラス変数に代入された`StChara`インスタンスが生成される。（以下：`dathインスタンス`）

**（例②）**※同様に`ruku`というクラス変数に代入された`StChara`インスタンスを生成。（以下：`rukuインスタンス`）

```java

StChara ruku = new StChara();        
```

#インスタンス毎の属性の値設定

**(考え方)**
クラスで定義した属性に対して、インスタンス毎のフィールド値を設定する。

**(設定方法）**
`クラス変数名.変数名=値`

**(例〜dathインスタンスに値を設定する場合〜)**

```java
StChara dath = new StChara();
dath.name = "ダース・ベイダー";
dath.focelevel = 100;
dath.status = "暗黒卿";
```	
**(例〜rukuインスタンスに値を設定する場合〜)**

```java

StChara ruku = new StChara();
ruku.name = "ルーク・スカイウォーカー";
ruku.focelevel = 60;
ruku.status = "ジェダイの騎士";
```

**(補足)**
`クラス変数名.`とする事で、どのクラス変数に代入されたインスタンスに対して、値を設定するか判断している。

#振る舞いの呼び出し
**(考え方)**
クラスに定義している、振る舞い（メソッド）を別のメソッドから呼び出す。
`クラス変数名.メソッド名();`とする事で、宣言した**クラス変数名に代入された、インスタンスから呼び出し**を実施する。

**(呼出方法)**

`クラス変数名.メソッド名();`

**(例〜dathインスタンスから呼び出した場合〜）**

```java

dath.selfIndroduction();//呼び出し
```

↓　「呼び出し」

```java
    void selfIndroduction() {//自己紹介の振る舞い
        System.out.println("私の名前は" + this.name);
        System.out.println("フォースレベルは" + this.focelevel);
        System.out.println("ステータスは" + this.status);
    }
```

↓　「インスタンス毎に設定されたフィールド参照」

```java
StChara dath = new StChara();
dath.name = "ダース・ベイダー";//上記のthis.nameはここを参照
dath.focelevel = 100;//上記のthis.focelevelはここを参照
dath.status = "暗黒卿";//上記のthis.statusはここを参照
```

↓　「出力」


```java
私の名前はダース・ベイダー
フォースレベルは100
ステータスは暗黒卿
```

**(補足)**

クラス上で`this.変数名`とする事で、呼び出し元インスタンスのフィールド値を参照する。



**(例②〜rukuインスタンスから呼び出した場合〜)**

```java
ruku.selfIndroduction();
```

↓ 「呼び出し」


```java
    void selfIndroduction() {//自己紹介の振る舞い
        System.out.println("私の名前は" + this.name);
        System.out.println("フォースレベルは" + this.focelevel);
        System.out.println("ステータスは" + this.status);
    }
```

↓ 「インスタンス毎に設定されたフィールド参照」

```java
StChara ruku = new StChara();
ruku.name = "ルーク・スカイウォーカー";
ruku.focelevel = 60;
ruku.status = "ジェダイの騎士";
```

↓ 「出力」

```java

私の名前はルーク・スカイウォーカー
フォースレベルは60
ステータスはジェダイの騎士
```

**(補足)**

今回は、`rukuインスタンス`から呼び出したため、`ruku`インスタンスのフィールドを参照した出力結果となる。