第11週:super/subクラス、継承性、メソッド再定義 subクラスとsuperクラス superクラスの継承 メソッド再定義 Java Programming(Step11)
Java Programming(Step11) super/subクラス superクラスとsubクラスは相対関係である。 superクラスはsubクラスを含む。 subクラスはsuperクラスの一部分です。 superクラスはsubクラスよりもっと一般的な定義である。逆に、subクラスはsuperクラスよりもっと具体的な定義である。 例:class Point と class Circle class Pointは一般的な点(x、y)ですが、class Circleは点(x、y)と半径(r)の定義です。 class Pointはsuperクラスです。class Circleはsubクラスです。 Point Circle Java Programming(Step11)
Java Programming(Step11) circleクラスの定義 PointクラスとCircleクラスはsuper-sub関係がありますが,その関係を使ってない,Circleクラスを独立的に定義します。 CircleクラスにはPointクラスを使って定義する場合、“has a” 関係と言われます。 “has a” 関係では、クラスオブジェクトが他のクラスのオブジェクトへの参照をメンバとして含みます。 public class Point { protected int x, y; // 点の座標 // パラメータなしのコンストラクタ public Point() { x = 0; y = 0;} // パラメータあるコンストラクタ public Point( int x, int y ) { this.x = x; this.y = y; } // メソッド public String toString(){ return “(“ + x + “,” + y + “)”; } public class Circle{ protected int x, y; // 円の中心座標 protected double r; //円の半径 // パラメータなしのコンストラクタ public Circle() {x = 0; y = 0; r = 0.0 ; } // パラメータあるコンストラクタ public Circle( int x, int y, double r) {this.x = x; this.y = y; this.r= r ; } // メソッド public String toString(){ return “Center =“ + “(“ + x + “,” + y + “)” + “; Radius =” + r ; } public class Circle { protected Point p; //円の中心座標 protected double r; //円の半径 // パラメータなしのコンストラクタ public Circle() {p=new Point(); r=0.0; } // パラメータあるコンストラクタ public Circle( int x, int y, double r) {p=new Point(x, y); this.r = r; } // メソッド public String toString(){ return “Center =“ + p.toString() + “; Radius =” + r ; } Java Programming(Step11)
Java Programming(Step11) subクラスの定義 PointクラスとCircleクラスはsuper-sub関係がありますので,その関係を使って,Circleクラスはsuperクラス(Pointクラス)を継承(inheritance)して定義する場合、“is a” 関係と言われます。 “is a”関係では、サブクラス型のオブジェクトもスーパークラス型のオブジェクトとして扱われます。クラスヘッダに(キーワードextendsを使って)明示します。 public class Point { protected int x, y; //点の座標 //パラメータなしのコンストラクタ public Point() { x = 0; y = 0;} //パラメータあるコンストラクタ public Point( int x, int y ) { this.x = x; this.y = y; } // メソッド public String toString(){ return “(“ + x + “,” + y + “)”; //(x,y) } public class Circle extends Point{ protected double r; //円の半径 //パラメータなしのコンストラクタ public Circle() {super(); r = 0.0; } //パラメータあるコンストラクタ public Circle( int x, int y, double r) {super(x, y); this.r = r; } // メソッド public String toString(){ return “Center =“ + super.toString() + “; Radius=” + r ; } Java Programming(Step11)
Java Programming(Step11) superクラスの継承 What? プログラムはそれまでに定義したスーパークラスのインスタンス変数やメソッドを新しいクラスが継承するよう指定することができます。この場合、新しいクラスをサブクラスと呼びます。 Why? 継承を使えばソフトウェアの再利用性を高めることができます。スーパークラスのインスタンス変数やメソッドをサブクラスに全て継承ように使うことができます。 How? サブクラスにインスタンス変数とコンストラクタとメソッドの定義。 super – X’s(super) クラス。 this - Y’s(sub) クラス。 スーパークラスのコンストラクタを呼ぶ。。 public Circle() {super(); r = 0.0; } public Circle( int x, int y, double r) {super(x, y); this.r = r; } 継承だから、省略する。 Class Y extends X{ X’s インスタンス変数; X’s メソッド; Y’s 新しいインスタンス変数; Y’s コンストラクタ; Y’s 新しいメソッド; } Class X{ X’s インスタンス変数; X’s コンストラクタ; X’s メソッド; } public Y(パラメータ){ super(X’sパラメータ); this.Y’s新しいパラメータ; } Y’s 新しいインスタンス変数の初期化。 public Circle() {super(); r = 0.0; } public Circle( int x, int y, double r) {super(x, y); this.r = r; } Java Programming(Step11)
Java Programming(Step11) メソッド再定義 When? スーパークラスのあるメソッドがサブクラスに適してない場合は、サブクラスの中でそのメソッドを再定義(上書き、オーバーライドと言う)します。 メソッド再定義とメソッド多重定義はどんな違いますか? メソッド再定義はスーパークラスのあるメソッドがサブクラス中でそのメソッドを再定義すること。 メソッド多重定義は同一名のメソッドをいくつ定義すること。 例:スーパークラスPointクラスの中のメソッドtoString()をサブクラスCircleクラスの中で再定義します。 public class Point { protected int x, y; //点の座標 。。。。。。 // メソッド public String toString(){ return “(“ + x + “,” + y + “)”; //(x,y) } public class Circle extends Point{ protected double r; //円の半径 。。。。。。 // メソッド public String toString(){ return “Center =“ + super.toString() + “; Radius=” + r ; } Java Programming(Step11)
Java Programming(Step11) クラス階層 public class Point { protected int x, y; //点の座標 //パラメータなしのコンストラクタ public Point() { x = 0; y = 0;} //パラメータあるコンストラクタ public Point( int x, int y ) { this.x = x; this.y = y; } // メソッド public String toString(){ return “(“ + x + “,” + y + “)”; //(x,y) } public class Circle extends Point{ protected double r; //円の半径 //パラメータなしのコンストラクタ public Circle() {super(); r = 0.0; } //パラメータあるコンストラクタ public Circle( int x, int y, double r) {super(x, y); this.r = r; } // メソッド public String toString(){ return “Center =“ + super.toString() + “; Radius=” + r ; } public class Cylinder extends Circle{ protected double h; //円柱の高さ //パラメータなしのコンストラクタ public Cylinder() {super(); h = 0.0; } //パラメータあるコンストラクタ public Cylinder( int x, int y, double r, double h) {super(x, y, r); this.h = h; } // メソッド public String toString(){ return super.toString() + “; 高さ = ” + h; } Point Circle Cylinder Java Programming(Step11)
Java Programming(Step11) クラス階層の例 階層関係を使ってない場合、 public class GraduateStudent{ String name; int grade; String department; String laboratory; // constructor public GraduateStudent(String name, int grade, String department, String laboratory) { this.name=name; this.grade=grade; this.department=department; this.laboratory=laboratory;} // method public char ShortName() { return name.charAt(0);} public String toString(){ return "Name :" + name +"(grade "+ grade+") in " + department+ " at "+ laboratory; } public class Human { public String name; // constructor public Human( String name) { this.name = name;} // methomd public char ShortName() { return name.charAt(0);} public String toString(){ return "Name: " + name; } public class Student{ String name; int grade; String department; // constructor public Student(String name, int grade, String department) { this.name=name; this.grade=grade; this.department=department;} // method public char ShortName() { return name.charAt(0);} public String toString(){ return "Name :" +name+ "(grade "+ grade+") in " + department; } Java Programming(Step11)
Java Programming(Step11) つづく super クラス – subクラス – subsub クラス Human Student GraduateStudent superクラス – subクラス Student GraduateStudent protected アクセス修飾子:限定公開アクセスのレベルは公開アクセスと非公開アクセスの中間です。スーパークラスの限定公開(protected)インスタンス変数には、そのスーパークラスのメソッド、サブクラスのメソッド、および同一パッケージ内にあるクラスのメソッドだけがアクセスできます。 public class GraduateStudent extends Student{ //String name; //int grade; String department; String laboratory; // constructor public GraduateStudent(String name, int grade, String department, String laboratory) { super(name, grade, department); this.laboratory = laboratory;} // method //public char ShortName() { //return name.charAt(0);} public String toString(){ return super.toString() + " at " + laboratory; } public class Human { public String name; // constructor public Human( String name) { this.name = name;} // methomd public char ShortName() { return name.charAt(0);} public String toString(){ return "Name: " + name; } public class Student extends Human{ //String name; int grade; String department; // constructor public Student(String name, int grade, String department) { super(name); this.grade=grade; this.department=department;} // method //public char ShortName() { //return name.charAt(0);} public String toString(){ return super.toString() + "(grade "+ grade+") in " + department; } Java Programming(Step11)
Java Programming(Step11) 出力のApplication プログラム public class ObjectCreationA { public static void main ( String args[] ) { Human A = new Human("Nonaka"); Student B = new Student("Hayasaka", 1, "CS"); GraduateStudent C = new GraduateStudent ("Tsuboi", 2, "DM", "MICC"); System.out.println("Human A ("+A.ShortName()+") -- " + A.toString() ); System.out.println("Student B ("+B.ShortName()+") -- " + B.toString() ); System.out.println( "Graduate Student C ("+C.ShortName()+") -- " + C.toString()); } Output in MS-DOS Window: Human A (N) – Name: Nonaka Student B (H) – Name: Hayasaka(grade 1) in CS Graduate Student C (T) – Name: Tsuboi (grade 2) in DM at MICC Java Programming(Step11)
Java Programming(Step11) MICC Laboratory 課題 点、辺、3角形、3角錐でクラス階層を作成せよ。 点、辺、3角形、3角錐のオブジェクトを出力するようにアプレットを作成しなさい。 Java Programming(Step11)