-------------------------------------------------------------------------------- ■ H ■ --> いくつかのデータをまとめて扱う部品に、個々のデータを扱う関数を付ける。 これらは、setter(セッター), getter(ゲッター)と呼ばれる…H -------------------------------------------------------------------------------- public class Student { private int no; private String name; //------ひとつひとつのデータを設定・取り出しを行う関数(メソッド)を作る void setNo(int _no){ no = _no; } int getNo(){ return no; } void setName(String _name){ name = _name; } String getName(){ return name; } //------------------------------- void hyouji(){ System.out.println(no + "\t" + name); } //クラス部品を呼び出すときに(newされるとき)に最初に動くクラス名と同じ名前の特別な関数部分 Student(int _no, String _name){ if(_no > 0){ no = _no;//ナンバーが正のデータなら代入する }else{ System.out.println("ナンバーに不正なデータが設定されました!再度適切なデータを設定してください."); } if( ! _name.equals("")){//氏名が無文字でないならば代入する name = _name; }else{ System.out.println("氏名に不正なデータが設定されました!再度適切なデータを設定してください."); } } }//classの終わり ------------------------------------------------------------------------- //そうするとHのクラス部品を呼び出すMainクラスは以下のように //個々のデータをばらばらに扱うことができるようになる…I public class StudentMain2 { public static void main(String[] args){ Student student1 = new Student(1, "阿部 健二"); student1.hyouji(); //一度設定したデータの変更・更新が個々にできるようになる System.out.println("変更後"); student1.setName("阿部 健治"); student1.hyouji(); Student student2 = new Student(2, "伊藤 幸子"); student2.hyouji(); Student student3 = new Student(3, "江田 太郎"); student3.hyouji(); //名前だけを個々に取り出すこともできる System.out.println("氏名一覧"); System.out.println(student1.getName()); System.out.println(student2.getName()); System.out.println(student3.getName()); }//main()ブロックの終わり }//classの終わり **************************************** -------------------------------------------------------------------------------- ■ H ■ --> 一度作ったクラス部品を拡張できる。(いわゆる「継承」と呼ばれる)…J -------------------------------------------------------------------------------- //Studentクラス部品に新しいデータ要素を追加したいが、簡単にはできないか? //学生番号、氏名、住所のデータをまとめて扱いたい! public class StudentAddress extends Student { String address; //あらたに付け加えたい要素だけを書けばいい void hyouji(){ super.hyouji(); //拡張元のStudentクラスのhyouji()関数を呼び出すsuper文 System.out.println(address); //あらたに付け加えた要素だけを表示する文を書く } Student(int _no, String _name, String _address){ super( _no, _name); //拡張元のStudentクラスのnew関数を呼び出し、番号、名前データを設定 address = _address; } }//classの終わり ------------------------------------------------------------------------- //そうするとのJのStudentAddressクラス部品を呼び出すMainクラスは以下のように書ける public class AddressMain { public static void main(String[] args){ StudentAddress studentAddress1 = new StudentAddress(1, "阿部 健二", "沖縄県那覇市"); studentAddress1.hyouji(); StudentAddress studentAddress2 = new StudentAddress(2, "伊藤 幸子", "石川県金沢市"); studentAddress2.hyouji(); StudentAddress studentAddress3 = new StudentAddress(3, "江田 太郎", "愛知県名古屋市"); studentAddress3.hyouji(); }//main()ブロックの終わり }//classの終わり ****************************************** -------------------------------------------------------------------------------- ■ I ■ --> 動作命令のないメソッドを持つインターフェース部品、抽象クラス部品 …K -------------------------------------------------------------------------------- //例えば、図形の長方形、三角形、円の面積を自動計算するプログラムをクラス部品を利用して作ることを考える //そこで、今回は長方形クラス、三角クラス、円クラスという部品を作ってみる //長方形クラス …K package zukei;//図形パッケージに入れる public class Shikaku { private double teihen;//底辺 private double takasa;//高さ //パッケージ外からこのメソッドを呼び出して利用する前提でpublicを付けていく public void setTeihen(double _teihen){ teihen = _teihen; } public double getTeihen(){ return teihen; } public void setTakasa(double _takasa){ takasa = _takasa; } public double getTakasa(){ return takasa; } public Shikaku(double _teihen, double _takasa){ teihen = _teihen; takasa = _takasa; } //●長方形の面積を計算して小数で返すメソッド public double calcMenseki(){ return teihen * takasa; } }//終わり -------------------------------------------------------------------------------- //三角クラス package zukei;//図形パッケージに入れる public class Triangle { private double teihen;//底辺 private double takasa;//高さ //パッケージ外からこのメソッドを呼び出して利用する前提でpublicを付けていく public void setTeihen(double _teihen){ teihen = _teihen; } public double getTeihen(){ return teihen; } public void setTakasa(double _takasa){ takasa = _takasa; } public double getTakasa(){ return takasa; } public Triangle(double _teihen, double _takasa){ teihen = _teihen; takasa = _takasa; } //●三角形の面積を計算して小数で返すメソッド(たまたま長方形とはメソッド名が違っている) public double keisanMenseki(){ return teihen * takasa / 2; } } -------------------------------------------------------------------------------- //円クラス package zukei;//図形パッケージに入れる public class En { private double hankei;//半径 //値を固定するfinalは、不変データに設定する private final double PI = 3.14; //円周率 //パッケージ外からこのメソッドを呼び出して利用する前提でpublicを付けていく public void setHankei(double _hankei){ hankei = _hankei; } public double getHankei(){ return hankei; } public En(double _hankei){ hankei = _hankei; } //●円の面積を計算して小数で返すメソッド(これもたまたまメソッド名が違っている) public double menseki(){ return hankei * hankei * PI; } } ------------------------------------------------------------------------------------ //●● これらの部品を使った面積計算プログラムを、main()メソッドを入れたクラスで書いてみる。 //図形の種類が違うだけで計算処理関数(メソッド)名が違うのは、部品を使う側にとっては //おぼえることが多くなり、わずわわしい! package zukei; public class MensekiMain { public static void main(String[] args){ Shikaku si = new Shikaku(10,20); //底辺10cm、高さ20cmの長方形という設定 System.out.println(si.calcMenseki()); Triangle tri = new Triangle(10,20); //底辺10cm、高さ20cmの三角形 System.out.println(tri.keisanMenseki()); En en    = new En(10); //半径10cmの円 System.out.println(en.menseki()); }//main()ブロックの終わり }//classの終わり ----------------------------------------------------------------------------------------- ■ J ■ --> 動作命令のないメソッドを持つインターフェース部品でメソッド名を統一する …L ----------------------------------------------------------------------------------------- package zukei; public abstract interface MensekiKeisan { public abstract double menseki(); //処理は書くことができない。メソッド名だけを決める。中身がないのでabstract/抽象メソッド }//以上 ------------------------------------------------------------------------------------- //長方形クラス、三角クラス、円クラスに、上記のインターフェース部品を連結する(implementsキーワードを使う) //長方形クラス …K package zukei;//図形パッケージに入れる public class Shikaku { private double teihen;//底辺 private double takasa;//高さ //パッケージ外からこのメソッドを呼び出して利用する前提でpublicを付けていく public void setTeihen(double _teihen){ teihen = _teihen; } public double getTeihen(){ return teihen; } public void setTakasa(double _takasa){ takasa = _takasa; } public double getTakasa(){ return takasa; } public Shikaku(double _teihen, double _takasa){ teihen = _teihen; takasa = _takasa; } //●こうするとメソッド名を、インターフェース内のmenseki()という名前に合わせなければならなくなる public double menseki(){ return teihen * takasa; } }//終わり ---------------------------------------------------------------------------------------- //同様に三角クラス、円クラスに、上記と同じ記述を加えてください。 //以上のような結果、実際に計算処理を行うMensekiMainは、下記のようにメソッド名が統一される package zukei; public class MensekiMain { public static void main(String[] args){ Shikaku si = new Shikaku(10,20); //底辺10cm、高さ20cmの長方形という設定 System.out.println(si.menseki()); Triangle tri = new Triangle(10,20); //底辺10cm、高さ20cmの三角形 System.out.println(tri.menseki()); En en    = new En(10); //半径10cmの円 System.out.println(en.menseki()); }//main()ブロックの終わり }//classの終わり ----------------------------------------------------------------------------------------- ■ J ■ --> 長方形クラス、三角クラスの共通点を、動作命令のないメソッド(abstract/抽象メソッド) を持つ"抽象クラス部品"として作成してみる …M ----------------------------------------------------------------------------------------- package zukei;//図形パッケージに入れる //角度を持った図形の一般名として、Angle(角)と名付けた public abstract class Angle implements MensekiKeisan { private double teihen;//底辺 private double takasa;//高さ //パッケージ外からこのメソッドを呼び出して利用する前提でpublicを付けていく public void setTeihen(double _teihen){ teihen = _teihen; } public double getTeihen(){ return teihen; } public void setTakasa(double _takasa){ takasa = _takasa; } public double getTakasa(){ return takasa; } public Angle(double _teihen, double _takasa){ teihen = _teihen; takasa = _takasa; } //各々の図形によって面積の計算の仕方が違うので、動作処理内容は書くことができない public abstract double menseki(); }//以上 -------------------------------------------------------------------------------------- //インターフェースと違うところは、要素として、変数を置けるところ! //class の前にかならず abstract を付けるところです。 -------------------------------------------------------------------------------------- //そうすると、先の長方形クラス(Shikaku)は次のように書くことができる <extends の復習です!>。 package zukei;//図形パッケージに入れる public class Shikaku extends Angle implements MensekiKeisan { public Shikaku(double _teihen, double _takasa){ super(_teihen, _takasa); } //長方形の面積を計算して小数で返すメソッド public double menseki(){ return getTeihen() * getTakasa(); //拡張もとのクラスのメソッドは名指しで呼び出せる } }//以上 --------------------------------------------------------------------------------------