JavaOPPについて

#まずOPPを説明する
OOP (オブジェクト指向プログラミング)
OOP (Object-Oriented Programming) はデータを オブジェクト 内にカプセル化して、その構成部品ではなくてオブジェクト自体が操作される、プログラミングアプローチです。
#カプセル化
カプセル化というのはコードを非表示にして、セキュリティを保証してものです。そしてgetメソッドとsetメソッドを使用してアクセスおよび変更します。

```perl:uniq.pl
private String name;
public String getName() {//名前をゲット
		return name;
	}
	public void setName(String name) {//名前を制定
		this.name = name;
```
カプセル化はアクセス修飾子を使ってカプセル化です、アクセス修飾子は四つがあり：
pubilc　protected default private 権限が大きい順にソートされます

#継承
   継承は既存のクラスから新しいクラスを派生し、新しいクラスは既存のクラスのデータ属性と動作を吸収し、新しい能力を拡張することができます。
   例えば　動物は父親　草食動物　肉食動物は息子　動物は彼ら同じの特徴だから父親があれば色な重複なコードを節約ですきます。
ペンギン：

```perl:uniq.pl
　　public class Penguin { 
    private String name; 
    private int id; 
    public Penguin(String myName, int  myid) { 
        name = myName; 
        id = myid; 
    } 
    public void eat(){ 
        System.out.println(name+"食べている"); 
    }
    public void sleep(){
        System.out.println(name+"眠ている");
    }
    public void introduction() { 
        System.out.println("こんにちは！私は" + id + "番" + name + "です."); 
    } 
}

```
ネズミ：

```perl:uniq.pl
public class Mouse { 
    private String name; 
    private int id; 
    public Mouse(String myName, int  myid) { 
        name = myName; 
        id = myid; 
    } 
    public void eat(){ 
        System.out.println(name+"食べている"); 
    }
    public void sleep(){
        System.out.println(name+"眠ている");
    }
    public void introduction() { 
        System.out.println("こんにちは！私は" + id + "番" + name + "です."); 
    } 
}

```
　　以上のコード重複コードがあり、だから継承を使えば：

```perl:uniq.pl
//父親
public class Animal { 
    private String name;  
    private int id; 
    public Animal(String myName, int myid) { 
        name = myName; 
        id = myid;
    } 
    public void eat(){ 
        System.out.println(name+"食べてる"); 
    }
    public void sleep(){
        System.out.println(name+"眠ている");
    }
    public void introduction() { 
        System.out.println("こんにちは！私は"  + id + "番" + name + "です."); 
    } 
}
//ペンギン
public class Penguin extends Animal { 
    public Penguin(String myName, int myid) { 
        super(myName, myid); 
    } 
}
//ネズミ
public class Mouse extends Animal { 
    public Mouse(String myName, int myid) { 
        super(myName, myid); 
    } 
}
```

ちなみに
super簡単的に言えば父親のものを使うということです
thisは自身の引用です 例えばsetメソッドの中で：

```perl:uniq.pl
　　private String name;
　　　public void setName(String name) {
　　　  this.name = name;//this.nameは上のprivate string name 
　　　　　//nameは下set メソッドの（string name）
```

    


#多型（polymorphism）
多態の存在の3つの必要条件：
1.継承
2.複写(override&overload)
3.親参照が子オブジェクトを指す:Parent p = new Child();

```perl:uniq.pl
class Shape {
    void draw() {}
}
 
class Circle extends Shape {
    void draw() {
        System.out.println("Circle.draw()");
    }
}
 
class Square extends Shape {
    void draw() {
        System.out.println("Square.draw()");
    }
}
 
class Triangle extends Shape {
    void draw() {
        System.out.println("Triangle.draw()");
    }
}
```
polymorphismよく使てる方法：
1.複写(override&overload) extend 
2.抽象（abstract）extend
   抽象クラスに抽象的な方法がある必要はありません．抽象的な方法があれば抽象クラスでなければならない。抽象クラスのサブクラスは、サブクラスが抽象クラスでない限り、抽象クラスにおける抽象メソッドの具体的な実装を与えなければならない。
3.インタ—フェ—ス（interface）implements

#abstractとinterfaceの違い
　abstractはis a関係　例えば　bus is a car
  interfaceは has a(can)関係　例えばprogrammer can sing
  programmer is a employee（abstract） ，he can dance（interface）