情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |
class クラス名 extends スーパークラス名 { 変更部分 }
super.var
01 /****************************/ 02 /* 継承の基本 */ 03 /* coded by Y.Suganuma */ 04 /****************************/ 05 import java.io.*; 06 import temp.Oya; 07 08 public class Test { 09 public static void main(String args[]) throws IOException 10 { 11 // 親 12 Oya oya = new Oya (1, 2, 3, 4); 13 System.out.println("親 : "); 14 System.out.println(" Oyaの関数を利用"); 15 oya.output_oya(); 16 System.out.println(" from main"); 17 System.out.println(" priv1 ?, prot1 ?, pub " + oya.pub + ", ndef1 ?, stat " + Oya.stat); 18 // 子供 19 Kodomo k = new Kodomo (10, 20, 30, 40, 50, 60, 70); 20 System.out.println("子供 : "); 21 // Oyaから継承した部分 22 System.out.println(" Oyaから継承した関数を利用"); 23 k.output_oya(); 24 System.out.println(" Kodomoの関数を利用"); 25 k.output_k(); 26 System.out.println(" from main"); 27 System.out.println(" priv1 ??, priv2 ??, prot1 ??, prot2 " + k.prot2 + ", pub " + k.pub + ", ndef1 ??, ndef2 " + k.ndef2 + ", stat " + Kodomo.stat); 28 } 29 } 30 31 /**********************/ 32 /* クラスkodomoの定義 */ 33 /**********************/ 34 class Kodomo extends Oya { 35 private int priv2; 36 protected int prot2; 37 int ndef2; 38 // コンストラクタ 39 Kodomo (int n1, int n2, int n3, int n4, int n5, int n6, int n7) 40 { 41 super (n1, n2, n3, n4); // 親のコンストラクタの呼び出し 42 priv2 = n5; 43 prot2 = n6; 44 ndef2 = n7; 45 } 46 // 出力 47 void output_k() 48 { 49 System.out.println(" priv1 ??, priv2 " + priv2 + ", prot1 " + prot1 + ", prot2 " + prot2 + ", pub " + pub + ", ndef1 ??, ndef2 " + ndef2 + ", stat " + stat); 50 } 51 } 52 53 --------------------------------------------------------------------------- 54 55 /*******************/ 56 /* クラスOyaの定義 */ 57 /*******************/ 58 package temp; 59 public class Oya { 60 public static int stat = -1; 61 private int priv1; 62 protected int prot1; 63 public int pub; 64 int ndef1; 65 // コンストラクタ 66 public Oya (int n1, int n2, int n3, int n4) 67 { 68 priv1 = n1; 69 prot1 = n2; 70 pub = n3; 71 ndef1 = n4; 72 } 73 // 出力 74 public void output_oya() 75 { 76 System.out.println(" priv1 " + priv1 + ", prot1 " + prot1 + ", pub " + pub + ", ndef1 " + ndef1 + ", stat " + stat); 77 } 78 }
01 親 : 02 Oyaの関数を利用 03 priv1 1, prot1 2, pub 3, ndef1 4, stat -1 04 from main 05 priv1 ?, prot1 ?, pub 3, ndef1 ?, stat -1 06 子供 : 07 Oyaから継承した関数を利用 08 priv1 10, prot1 20, pub 30, ndef1 40, stat -1 09 Kodomoの関数を利用 10 priv1 ??, priv2 50, prot1 20, prot2 60, pub 30, ndef1 ??, ndef2 70, stat -1 11 from main 12 priv1 ??, priv2 ??, prot1 ??, prot2 60, pub 30, ndef1 ??, ndef2 70, stat -1
/****************************/ /* 継承の基本 */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; public class Test { public static void main(String args[]) throws IOException { // 親 Oya oya = new Oya (1, 2, 3, 4); System.out.println("親 : "); System.out.println(" Oyaの関数を利用"); oya.output_oya(); System.out.println(" from main"); System.out.println(" priv1 ?, prot1 " + oya.prot1 + ", pub " + oya.pub + ", ndef1 " + oya.ndef1 + ", stat " + Oya.stat); // 子供 Kodomo k = new Kodomo (10, 20, 30, 40, 50, 60, 70); System.out.println("子供 : "); // Oyaから継承した部分 System.out.println(" Oyaから継承した関数を利用"); k.output_oya(); System.out.println(" Kodomoの関数を利用"); k.output_k(); System.out.println(" from main"); System.out.println(" priv1 ??, priv2 ??, prot1 " + k.prot1 + ", prot2 " + k.prot2 + ", pub " + k.pub + ", ndef1 " + k.ndef1 + ", ndef2 " + k.ndef2 + ", stat " + Kodomo.stat); } } /**********************/ /* クラスkodomoの定義 */ /**********************/ class Kodomo extends Oya { private int priv2; protected int prot2; int ndef2; // コンストラクタ Kodomo (int n1, int n2, int n3, int n4, int n5, int n6, int n7) { super (n1, n2, n3, n4); // 親のコンストラクタの呼び出し priv2 = n5; prot2 = n6; ndef2 = n7; } // 出力 void output_k() { System.out.println(" priv1 ??, priv2 " + priv2 + ", prot1 " + prot1 + ", prot2 " + prot2 + ", pub " + pub + ", ndef1 " + ndef1 + ", ndef2 " + ndef2 + ", stat " + stat); } } /*******************/ /* クラスOyaの定義 */ /*******************/ class Oya { public static int stat = -1; private int priv1; protected int prot1; public int pub; int ndef1; // コンストラクタ public Oya (int n1, int n2, int n3, int n4) { priv1 = n1; prot1 = n2; pub = n3; ndef1 = n4; } // 出力 public void output_oya() { System.out.println(" priv1 " + priv1 + ", prot1 " + prot1 + ", pub " + pub + ", ndef1 " + ndef1 + ", stat " + stat); } }
親 : Oyaの関数を利用 priv1 1, prot1 2, pub 3, ndef1 4, stat -1 from main priv1 ?, prot1 2, pub 3, ndef1 4, stat -1 子供 : Oyaから継承した関数を利用 priv1 10, prot1 20, pub 30, ndef1 40, stat -1 Kodomoの関数を利用 priv1 ??, priv2 50, prot1 20, prot2 60, pub 30, ndef1 40, ndef2 70, stat -1 from main priv1 ??, priv2 ??, prot1 20, prot2 60, pub 30, ndef1 40, ndef2 70, stat -1
/****************************/ /* 継承(フレームの表現) */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; /**********************/ /* クラスAnimalの定義 */ /**********************/ class Animal { /* 動物フレーム */ protected int ani; // 生物:0,その他:1 protected int ox; // 酸素呼吸:0,その他:1 Animal(int k1, int k2) // コンストラクタ { ani = k1; ox = k2; } void shu(int sw) // 生物か否かに答える { if (ani == sw) System.out.println("yes"); else System.out.println("no"); } } /*********************/ /* クラスHumanの定義 */ /*********************/ class Human extends Animal { /* 人間フレーム,クラスAnimalを継承 */ protected int height; // 身長 protected double weight; // 体重 Human(int x, int y) // コンストラクタ { super(x, y); // クラスAnimalのコンストラクタの呼び出し } void taiju() // 体重を返す関数 { System.out.println("体重は " + weight + " Kgです"); } } /********************/ /* クラスTaroの定義 */ /********************/ class Taro extends Human { /* 太郎フレーム,クラスHumanを継承 */ Taro(int hei, double wei) // コンストラクタ { super(0, 0); // クラスHumanのコンストラクタの呼び出し height = (hei == 0) ? 170 : hei; weight = (wei == 0.0) ? 0.9 * (height - 100) : wei; } } /**************************************/ /* mainメソッドを含むクラスTestの定義 */ /**************************************/ public class Test { public static void main(String args[]) throws IOException { Human h1 = new Human (0, 0); Taro t1 = new Taro (175, 0.0); h1.shu(1); // 人間は生物ではない? t1.shu(0); // 太郎は生物? t1.taiju(); // 太郎の体重は? } }
no yes 体重は 67.5 Kgです
/****************************/ /* 抽象クラス */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; /****************/ /* クラスFigure */ /****************/ abstract class Figure { double s; // 図形の面積 abstract void input(); // データの入力,抽象メソッド abstract void menseki(); // 面積の計算,抽象メソッド void print(int sw) // 結果の出力 { if (sw == 0) System.out.println(" 与えられた楕円の面積は " + s + " です"); else System.out.println("与えられた多角形の面積は " + s + " です"); } } /*****************/ /* クラスEllipse */ /*****************/ class Ellipse extends Figure { private double a, b; // 楕円の長径と短径 void input() // データの入力 { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("楕円の長径は? "); a = Double.parseDouble(in.readLine()); System.out.print("楕円の長径は? "); b = Double.parseDouble(in.readLine()); } catch (IOException ignored) {} } void menseki() // 楕円の面積 { s = 4.0 * Math.atan(1.0) * a * b; } } /*****************/ /* クラスPolygon */ /*****************/ class Polygon extends Figure { private int n; // 点の数 private int [] m; // 点の番号 private double [][] p; // 各点の座標 // コンストラクタ Polygon (int n1) { if (n1 < 3) { System.out.println("3点以上与えてください"); System.exit(1); } else { n = n1; m = new int [n]; p = new double [n][2]; } } // データの入力 void input() { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.println("各点の座標の入力(反時計回り)"); try { for (int i1 = 0; i1 < n; i1++) { System.out.print(" " + (i1+1) + " 番目の点のx座標は? "); p[i1][0] = Double.parseDouble(in.readLine()); System.out.print(" " + (i1+1) + " 番目の点のy座標は? "); p[i1][1] = Double.parseDouble(in.readLine()); } } catch (IOException ignored) {} } // 多角形の面積 void menseki() { for (int i1 = 0; i1 < n; i1++) m[i1] = i1; s = men(n, p, m); } /******************************/ /* 多角形の面積を再帰的に計算 */ /* n : 点の数 */ /* p : 点の座標 */ /* m : 点番号 */ /* return : 面積 */ /******************************/ private double men(int n, double [][] p, int [] m) { double s = 0.0; if (n == 3) // 三角形 s = sankaku(n, 0, m, p); else { int sw1 = 0; for (int i1 = 0; i1 < n && sw1 == 0; i1++) { int sw = check1(n, i1, m, p); // 多角形の中? if (sw == 0) { sw = check2(n, i1, m, p); // 中に他の点がある? if (sw == 0) { s = sankaku(n, i1, m, p); // i1から始まる三角形 for (int i2 = i1+1; i2 < n-1; i2++) // 点を除く m[i2] = m[i2+1]; s += men(n-1, p, m); // (n-1)この点からなる多角形 sw1 = 1; } } } } return s; } /***********************/ /* 三角形の面積の計算 */ /* n : 点の数 */ /* k : 開始点番号 */ /* m : 点番号 */ /* p : 点の座標 */ /* return : 面積 */ /***********************/ double sankaku(int n, int k, int [] m, double [][] p) { int k1 = m[k]; int k2 = (k == n-1) ? m[0] :m[k+1]; int k3; if (k < n-2) k3 = m[k+2]; else k3 = (k == n-2) ? m[0] : m[1]; double x1 = p[k2][0] - p[k1][0]; double y1 = p[k2][1] - p[k1][1]; double r1 = Math.sqrt(x1 * x1 + y1 * y1); double t1 = Math.atan2(y1, x1); x1 = p[k3][0] - p[k1][0]; y1 = p[k3][1] - p[k1][1]; double r2 = Math.sqrt(x1 * x1 + y1 * y1); double t2 = Math.atan2(y1, x1); double t3 = t2 - t1; double s = Math.abs(0.5 * r1 * r2 * Math.sin(t3)); return s; } /****************************************/ /* 三角形が多角形の内部か否かのチェック */ /* n : 点の数 */ /* k : 開始点番号 */ /* m : 点番号 */ /* p : 点の座標 */ /* return : =0 : 内部である */ /* =1 : 内部でない */ /****************************************/ int check1(int n, int k, int [] m, double [][] p) { double pi = 4.0 * Math.atan2(1.0, 1.0); int k1 = m[k]; int k2 = (k == n-1) ? m[0] :m[k+1]; int k3, sw = 0; if (k < n-2) k3 = m[k+2]; else k3 = (k == n-2) ? m[0] : m[1]; double x1 = p[k3][0] - p[k1][0]; double y1 = p[k3][1] - p[k1][1]; double t1 = Math.atan2(y1, x1); x1 = p[k2][0] - p[k1][0]; y1 = p[k2][1] - p[k1][1]; double t2 = Math.atan2(y1, x1); double t3 = t2 - t1; if (t3 > pi) t3 -= 2.0 * pi; else { if (t3 < -pi) t3 += 2.0 * pi; } if (t3 > 0.0) sw = 1; return sw; } /************************************************/ /* 三角形内に他の頂点が存在するか否かのチェック */ /* n : 点の数 */ /* k : 開始点番号 */ /* m : 点番号 */ /* p : 点の座標 */ /* return : =0 : 存在しない */ /* =1 : 存在する */ /************************************************/ int check2(int n, int k, int [] m, double [][] p) { double pi = 4.0 * Math.atan2(1.0, 1.0); int k1 = m[k]; int k2 = (k == n-1) ? m[0] :m[k+1]; int k3, sw = 0; if (k1 < n-2) k3 = m[k+2]; else k3 = (k == n-2) ? m[0] : m[1]; double x1 = p[k2][0] - p[k1][0]; double y1 = p[k2][1] - p[k1][1]; double t10 = Math.atan2(y1, x1); x1 = p[k3][0] - p[k2][0]; y1 = p[k3][1] - p[k2][1]; double t11 = Math.atan2(y1, x1); x1 = p[k1][0] - p[k3][0]; y1 = p[k1][1] - p[k3][1]; double t12 = Math.atan2(y1, x1); for (int i1 = 0; i1 < n && sw == 0; i1++) { if (i1 != k1 && i1 != k2 && i1 != k3) { x1 = p[m[i1]][0] - p[k1][0]; y1 = p[m[i1]][1] - p[k1][1]; double t2 = Math.atan2(y1, x1); double t3 = t2 - t10; if (t3 > pi) t3 -= 2.0 * pi; else { if (t3 < -pi) t3 += 2.0 * pi; } if (t3 > 0.0) { x1 = p[m[i1]][0] - p[k2][0]; y1 = p[m[i1]][1] - p[k2][1]; t2 = Math.atan2(y1, x1); t3 = t2 - t11; if (t3 > pi) t3 -= 2.0 * pi; else { if (t3 < -pi) t3 += 2.0 * pi; } if (t3 > 0.0) { x1 = p[m[i1]][0] - p[k3][0]; y1 = p[m[i1]][1] - p[k3][1]; t2 = Math.atan2(y1, x1); t3 = t2 - t12; if (t3 > pi) t3 -= 2.0 * pi; else { if (t3 < -pi) t3 += 2.0 * pi; } if (t3 > 0.0) sw = 1; } } } } return sw; } } /**************************************/ /* mainメソッドを含むクラスTestの定義 */ /**************************************/ public class Test { public static void main(String args[]) throws IOException { /* 楕円 */ Ellipse e1 = new Ellipse (); e1.input(); e1.menseki(); e1.print(0); /* 多角形 */ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("点の数は? "); int n = Integer.parseInt(in.readLine()); Polygon p1 = new Polygon (n); p1.input(); p1.menseki(); p1.print(1); } }
public interface インタフェース名 implements 親インタフェース名 [ , ・・・ ] { // 変数: public static final とみなされる // メソッド宣言:abstract とみなされる }
TestInter tm = new Test(...); // クラス Test は,インタフェース TestInter を継承している
01 /****************************/ 02 /* インタフェース */ 03 /* coded by Y.Suganuma */ 04 /****************************/ 05 import java.io.*; 06 07 /********************************/ 08 /* インタフェースTabemonoの定義 */ 09 /********************************/ 10 interface Tabemono { 11 boolean eatable = true; 12 int shukaku (); 13 } 14 15 /*********************/ 16 /* クラスYasaiの定義 */ 17 /*********************/ 18 class Yasai { 19 String name = "野菜"; 20 } 21 22 /**********************/ 23 /* クラスDaikonの定義 */ 24 /**********************/ 25 class Daikon extends Yasai implements Tabemono { 26 String name1 = "大根"; 27 double dia, length; // 大きさ(直径,長さ) 28 Daikon (double d, double l) // コンストラクタ 29 { 30 length = l; 31 dia = d; 32 } 33 public int shukaku () { return 12; } // インタフェースのshukakuのオーバーライド 34 } 35 36 /************************/ 37 /* クラスKudamonoの定義 */ 38 /************************/ 39 class Kudamono { 40 String name = "果物"; 41 } 42 43 /*********************/ 44 /* クラスRingoの定義 */ 45 /*********************/ 46 class Ringo extends Kudamono implements Tabemono { 47 String name1 = "リンゴ"; 48 double dia; // 大きさ 49 Ringo (double d) // コンストラクタ 50 { 51 dia = d; 52 } 53 public int shukaku () { return 10; } // インタフェースのshukakuのオーバーライド 54 } 55 56 /************************************/ 57 /* mainメソッドを含んだクラスの定義 */ 58 /************************************/ 59 public class Test { 60 public static void main (String[] args) 61 { 62 63 Daikon x = new Daikon (10.0, 50.0); 64 Ringo y = new Ringo (10.0); 65 Tabemono z = new Ringo (11.0); 66 67 System.out.println(x.name + "(" + x.name1 + ")" + " 大きさ " + x.length + " " + x.dia + " 収穫 " + x.shukaku() + " 食料 " + x.eatable); 68 System.out.println(y.name + "(" + y.name1 + ")" + " 大きさ " + y.dia + " 収穫 " + y.shukaku() + " 食料 " + Tabemono.eatable); 69 System.out.println("収穫 " + z.shukaku() + " 食料 " + z.eatable); 70 } 71 }
野菜(大根) 大きさ 50.0 10.0 収穫 12 食料 true 果物(リンゴ) 大きさ 10.0 収穫 10 食料 true 収穫 10 食料 true
情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |