【初心者】Java　オブジェクト指向／インスタンスフィールド／インスタンスメソッド／オーバーロード【備忘録２４】

##オブジェクト指向
楽にプログラムを組み立て、修正できるように存在する指向のこと。
プログラムの中に人間がいるかのようにし、それぞれに自己紹介をさせるような形。

###オブジェクト(別名：インスタンス)
情報と振る舞いに分けられる。
情報の種類としては、名前・年齢など。
振る舞いの種類としては、hello・walkなど。

※情報＝インスタンスフィールド
※振る舞い＝インスタンスメソッド

###クラス（メソッドをまとめる部品）
インスタンスの設計図を意味する。

##インスタンス
インスタンスを生成する際は基本的には変数に代入して用いる。
「クラス型　変数名　=　new クラス名();」
※大文字・小文字の違いに気を付ける。
※変数名に1、2、3など数字を付ける事で大量に作ることが可能。

###インスタンスフィールド
情報を格納しておく変数のこと。
基本的にクラスの一番上で定義する。

```java
class Person{
 public String name;
}
```

呼び出し方としては

```java
/*<Main.java>にて*/
...
Person person1 = new Person();
person1.name = "Suzuki";

System.out.println(person1.name);
```

###インスタンスメソッド
一般的な定義の仕方として↓

```java
class Person {
 public void hello(){   //「static」はつかないので気を付ける
  System.out.println("こんにちは");
 }
}
```

呼び出し方としては

```java
/*<Main.java>にて*/
Person person1 = new Person();
Person person2 = new Person();
person1.hello();
person2.hello();
/*インスタンスを生成した後でないと呼び出せないので注意！*/

```

###thisの使い方
this.変数名　とすることで、このクラスの変数と特定することができる。
【例】

```java
class Person{
 public String name;
 public void hello(){
  System.out.println ("こんにちは"+ this.name + "です");
/*ここで、下記の「Suzuki」に置き換えられる↑*/
 }
}
```

```java
/*<Main.java>にて*/
Person person = new Person();
person.name = "Suzuki";
person.hello(); //←ここで出力！
```

###コンストラクタ
newを使ってインスタンスを生成した後、自動で呼び出されるメソッドのこと。
定義として下記のような決まりがあるので気を付ける。
<1>コンストラクタ名はクラス名を同じにする
<2>戻り値を書いてはダメ！(voidも)

```java
class Person{
 public String name;
 Person (String name){
/*↑コンストラクタ名*/
  this.name = name;
 }
}
```
呼び出し方↓

```java
/*<Main.java>にて*/
Person person = new Person("Suzuki");
System.out.println(person.name);
```

###自己紹介文を書いてみる
※引数ではなく、thisで書いていくこと。

```java
class Person{ /*まずクラスの一番上で定義*/
 public String firstName;
 public String lastName;
 public int age;
 public double height;
 public double weight;

/*コンストラクタで複数を定義・並び順間違えないよう注意！*/
 Person(String firstName,String lastName,int age, double height, double weight){
  this.firstName = firstName;
  this.lastName = lastName;
  this.age = age;
  this.height = height;  
  this.weight = weight;
 }

 public String fullName(){
  return this.firstName + " " + this.lastName;
 }

 public double bmi(){
  return this.weight/this.height/this.height;
 }

/*出力用にprintDataを定義！！↓*/
 public void printData(){
  System.out.println("私の名前は"+this.fullName()+"です");
  System.out.println("年齢は"+this.age+"歳です");
  System.out.println("BMIは"+Math.round(this.bmi())+"です");
 }/*fullNameとbmiの後に()を忘れない！／Math.roundは四捨五入用*/
}
　
```
呼び出し↓

```java
/*<Main.java>にて*/
...
Person person1=new Person("Kate","Jones",27,1.6,50.0);
person1.printData();
...
```

###オーバーロード
ここで意味するオーバーロードとは、
person1がミドルネーム無し、person2がミドルネーム有りという場合
２つのコンストラクタを定義することで解決ができる。
【例】

```java
class Person{
 //...略
 public String middleName; //インスタンスフィールドの定義しているところにプラス。

 Person(String firstName,String lastName, ...); //1つ目のパターン
 //...※略
 Person(String firstName,String middleName,String lastName, ...); //2つ目のパターン
 //...※略
```

上記の「※略」のところは、ほぼ重複するので、2つ目の方は省略の書き方として

```java
...
 this(firstName,lastName,...weight); //ここで他のコンストラクタを呼び出す
 this.middleName = middleName; //追加したい物はここに書く
```

##振り返り・気を付ける事
・()を付けるのか、付けないのかなどがこんがらがってしまうので
しっかり確認しながら書いていく。
・以前の記事で、スペースの使い方やインデントのアドバイスをいただいたので
しっかり癖付けていきたいと思った。