- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2018-08-21T10:22:07+09:00","ldap:pandora"," pandora")
#author("2018-09-16T19:17:43+09:00","ldap:pandora"," pandora")
* ''オブジェクト指向'' [#bf98c062]
#contents
* 用語 [#nd9efde2]
- カプセル化(中身の隠蔽)
データ構造の中身を隠蔽し、データ操作に必要な情報のみを外部に提供すること。
データ構造の中身を隠蔽し、データ操作に必要な情報のみを外部に提供し、1つにまとめて持たせること。
#highlighter(java,number){{
// x には 11が入る。
int x = sum( 5, 6);
// 操作、データを一つにまとめたクラス
// ⇒ カプセル化
class Sample {
// private を設定することで、Sampleクラス以外からの
// アクセスを禁止する
// ⇒ データの隠蔽
private int ans = 0;
//-- ans 変数にアクセスするためのメソッドのみ外部に公開する。
// ⇒ データの隠蔽
//属性に対して、アクセスするためのメソッド(操作)
public void setQ(int i){
ans = this.calc(i);
}
//属性に対して、アクセスするためのメソッド(操作)
public int getA(){
return ans;
}
//-- ここまで
//
private int calc(int i) {
return i+i;
}
}
// 実行クラス
public class DataPlay {
public static void main(String[] args) {
// 具象クラスのインスタンス化
Sample obj = new Sample();
// obj.ans=5
// int x = obj.ans は出来ない為、
// setQメソッドとgetAメソッドを使って操作する
obj.setQ(5);
System.out.println(obj.getA());
}
}
}}
sum メソッドは、数値型の引数が2つあり、返り値に加算した値が返ってくる
→ データ操作に必要な情報
sum メソッドの中で、何をやっているかは知る必要はない。
→ データ構造の中身の隠蔽
-- DataPlayクラスは、Sampleクラスの中に、~
ansという変数があり、Calcというメソッドを使って計算しているということを~
知らなくても、setQで値を設定し、getAで値を取得出来る~
ということを知っていれば、Sampleクラスを利用できる。
- インヘリタンス(継承)
あるクラス(オブジェクト)があるクラス(オブジェクト)の特性を引き継ぐこと。
#highlighter(java,number){{
// Parent クラスの特性をChildクラスが引き継ぐ
public class Child extends Parent {
public Child() {
oyaMethod();
}
}
}}
Parentクラスにメソッド oyaMethodが定義されている場合、継承したChildクラスは
oyaMethodを定義しなくても、メソッドを使用することが出来る。
--Parentクラスにメソッド oyaMethodが定義されている場合~
継承したChildクラスはoyaMethodを定義しなくても、~
メソッドを使用することが出来る。
- ポリモーフィズム(多様性)
メッセージの送信側(メソッドの呼出側)とメッセージの受信側(メソッド側)が動的に決まること。
#highlighter(java,number){{
public class Chain {
String chainStr= null;
public Chain() {
chainStr = "";
}
// 引数違い①
public void addChain(String message) {
chainStr = chainStr + "string:" + message;
}
// 引数違い②
public void addChain(int message) {
chainStr = chainStr + "int:" + message;
}
// 引数違い③
public void addChain(double message) {
chainStr = chainStr + "double:" message;
}
class SuperClass {
String str = "Super";
public void thisName() {
System.out.println("SuperClass");
}
}
public class user {
public main() {
Chain obj = new Obj();
// 同名メソッドで異なる引数を処理できる。
obj.addChain("AAAA");
obj.addChain(1);
obj.addChain(1.1);
}
class SubClass extends SuperClass {
String str = "Sub";
// オーバーライド
public void thisName() {
System.out.println("SubClass");
}
// 引数違いのオーバロード
public void thisName(String name) {
System.out.println("SubClass" + name);
}
}
class ExeClass extends SubClass {
String str = "exe";
// オーバーライド
public void thisName() {
System.out.println("exeClass");
}
}
// 実行クラス
public class JavaPo {
public static void main(String[] args) {
// exeクラスのインスタンスを生成
ExeClass exe = new ExeClass();
// exeクラスのメソッド実行
exe.thisName();
// Subクラスから継承したexeクラスのメソッドw実行
exe.thisName("main");
// exeクラスの変数を出力
System.out.println(exe.str);
// Subクラスのインスタンスを生成
SuperClass oya = new SubClass();
//exeクラスのメソッドを実行
oya.thisName();
// SuperClassの変数を出力
System.out.println(oya.str);
}
}
}}
addChainメソッドは引数違いで、用意されており、どのaddChainメソッドを使うかは、
呼び出し元の引数で決定する。
※同名で、異なる引数を持つメソッドをオーバーロードの関係にあるメソッドという。
--生成するオブジュクトによって、どのthisNameメソッドを使うかを判断する。~
※継承したクラスと同名のメソッドをサブクラスに定義することをオーバーライドの関係にあるメソッドという。~
--thisNameメソッドは引数違いで、用意されておりどのthisNameメソッドを使うかは、呼び出し元の引数で決定する。~
※同名で、異なる引数を持つメソッドをオーバーロードの関係にあるメソッドという。
* 主なプログラミング言語 [#jdc4607d]
- smalltalk
- [[Java]]
- C++
- C#
- Objective-C