============================================================================================ Learn More About Java2 Professional Tutrial Vol.2 I-ichirow Suzuki ============================================================================================ Learn More About Java2 Professional Tutrial Chapter 1 変数とオブジェクト Chapter 2 お約束とコメント Chapter 3 メソッドと基本制御 Chapter 4 コンストラクタと初期化 Chapter 5 クラスの再利用 Chapter 6 継承 Chapter 7 ポリモフィズム Chapter 8 インターフェイスとインナークラス Chapter 9 コレクション Chapter10 エラーハンドリング Chapter11 ファイル入出力 Chapter12 Creating Windows AWT Chapter13 Creating Windows Swing Chapter14 Multiple Threads Chapter15 ネットワーク Chapter16 アルゴリズムとデータ構造 /////////////////////////////////////////////////////////////////////////////////////////// //// Chapter 5 クラスの再利用 //--------------------------------------------------- //: c05:SprinklerSystem.java // 宣言時の変数の値 class WaterSource { private String s; WaterSource() { System.out.println("WaterSource()"); s = new String("Constructed"); } public String toString() { return s; } } public class SprinklerSystem { private String valve1, valve2, valve3, valve4; // WaterSource source = new WaterSource() ; WaterSource source; int i; float f; void print() { System.out.println("valve1 = " + valve1); System.out.println("valve2 = " + valve2); System.out.println("valve3 = " + valve3); System.out.println("valve4 = " + valve4); System.out.println("i = " + i); System.out.println("f = " + f); System.out.println("source = " + source); } public static void main(String[] args) { SprinklerSystem x = new SprinklerSystem(); x.print(); } } /** * valve1 = null * valve2 = null * valve3 = null * valve4 = null * i = 0 * f = 0.0 * source = null */ //--------------------------------------------------- //: c05:Bath.java // コンストラクタの必要性と toString()の意味 class Soap { private String s; Soap() { System.out.println("Soap()"); s = new String("Constructed"); } public String toString() { return s; } } public class Bath { private String s1 = new String("Happy") ;// Initializing at point of definition: private String s2 = "Happy" ; private String s3 ; private String s4 ; Soap castille; int i; float toy; public Bath() { System.out.println("Inside Bath()"); s3 = new String("Joy"); i = 47; toy = 3.14f; castille = new Soap(); } void print() { // Delayed initialization: if(s4 == null) { s4 = new String("Joy"); } System.out.println("s1 = " + s1); System.out.println("s2 = " + s2); System.out.println("s3 = " + s3); System.out.println("s4 = " + s4); System.out.println("i = " + i); System.out.println("toy = " + toy); System.out.println("castille = " + castille); } public static void main(String[] args) { Bath b = new Bath(); b.print(); } } /** * Inside Bath() * Soap() * s1 = Happy * s2 = Happy * s3 = Joy * s4 = Joy * i = 47 * toy = 3.14 * castille = Constructed */ /////////////////////////////////////////////////////////////////////////////////////////// //// Chapter 6 継承 //: c06:Detergent.java 継承 class Cleanser { private String s = new String("Cleanser"); public void append(String a) { s += a; } public void dilute() { append(" dilute()"); } public void apply() { append(" apply()"); } public void scrub() { append(" scrub()"); } public void print() { System.out.println(s); } public static void main(String[] args) { Cleanser x = new Cleanser(); x.dilute(); x.apply(); x.scrub(); x.print(); } } public class Detergent extends Cleanser { // Change a method: public void scrub() { append(" Detergent.scrub()"); super.scrub(); // Call base-class version } // Add methods to the interface: public void foam() { append(" foam()"); } // Test the new class: public static void main(String[] args) { Detergent x = new Detergent(); x.dilute(); x.apply(); x.scrub(); x.foam(); x.print(); System.out.println("Testing base class:"); Cleanser.main(args); } } /** * Cleanser dilute() apply() Detergent.scrub() * Testing base class: * Cleanser dilute() apply() scrub() */ //--------------------------------------------------- //: c06:Cartoon.java 継承クラスの実行順序 // 継承先から実行される事に注意 class Art { public Art() { System.out.println("Art constructor"); } } class Drawing extends Art { public Drawing() { System.out.println("Drawing constructor"); } } public class Cartoon extends Drawing { public Cartoon() { System.out.println("Cartoon constructor"); } public static void main(String[] args) { Cartoon x = new Cartoon(); } } /** * Art constructor * Drawing constructor * Cartoon constructor */ //--------------------------------------------------- //: c06:Chess.java 継承の場合のスーパークラスへの値渡し class Game { public Game(int i) { System.out.println("Game constructor i = " + i); } } class BoardGame extends Game { public BoardGame(int i) { super(i); System.out.println("BoardGame constructor i = " + i); } } public class Chess extends BoardGame { public Chess() { super(11); System.out.println("Chess constructor i = " + i); } public static void main(String[] args) { Chess x = new Chess(); } } /** * Game constructor i = 11 * BoardGame constructor i = 11 * Chess constructor */ //--------------------------------------------------- //: c06:Hide.java スーパークラスコンストラクタのオーバーロード class Homer { char doh(char c) { System.out.println("doh(char)"); return 'd'; } float doh(float f) { System.out.println("doh(float)"); return 1.0f; } } class Milhouse {} class Bart extends Homer { void doh(Milhouse m) {} } class Hide { public static void main(String[] args) { Bart b = new Bart(); b.doh(1); // doh(float) used b.doh('x'); b.doh(1.0f); b.doh(new Milhouse()); } } /** * doh(float) * doh(char) * doh(float) */ //--------------------------------------------------- //: c06:Wind.java クラスオブジェクトを渡す class Instrument { public void play() { System.out.println("play....") ; } static void tune(Instrument i) { i.play(); } } class Wind extends Instrument { public static void main(String[] args) { Wind flute = new Wind(); Instrument.tune(flute); // Upcasting } } //--------------------------------------------------- //: c06:BlankFinal.java final 修飾子 class Poppet { } class BlankFinal { final int i = 0; // Initialized final final int j; // Blank final final Poppet p; // Blank final reference // Blank finals MUST be initialized in the constructor: BlankFinal() { // i = 1 ; // Error! j = 1; // Initialize blank final p = new Poppet(); } public static void main(String[] args) { BlankFinal bf = new BlankFinal(); } } //--------------------------------------------------- //: c06:Jurassic.java finalクラスはextendsできない class SmallBrain {} final class Dinosaur { int i = 7; int j = 1; SmallBrain x = new SmallBrain(); void f() {} } public class Jurassic { public static void main(String[] args) { Dinosaur n = new Dinosaur(); n.f(); n.i = 40; n.j++; } } //--------------------------------------------------- //: c06:Beetle.java スーパークラスを含む場合の実行プロセス分析 class Insect { int i = 9; int j; static int x1 = prt("static Insect.x1 initialized"); public Insect() { prt("i = " + i + ", j = " + j); j = 39; } static int prt(String s) { System.out.println(s); return 47; } } public class Beetle extends Insect { int k = prt("Beetle.k initialized"); static int x2 = prt("static Beetle.x2 initialized"); public Beetle() //ここを実行する前にsuperクラスのコンストラクタを実行 { prt("k = " + k); prt("j = " + j); } public static void main(String[] args) { prt("Beetle constructor"); Beetle b = new Beetle(); } } /** * static Insect.x1 initialized * static Beetle.x2 initialized * Beetle constructor * i = 9, j = 0 * Beetle.k initialized * k = 47 * j = 39 */ /////////////////////////////////////////////////////////////////////////////////////////// //// Chapter 7: ポリモフィズム //------------------------------------------------ //: c07:music:Music.java class Note { private int value; private Note(int val) { value = val; } public int getValue() { return value ; } public static final Note MIDDLE_C = new Note(0) ; public static final Note C_SHARP = new Note(1) ; public static final Note B_FLAT = new Note(2); } class Instrument { public void play(Note n) { System.out.println("Instrument.play()"); } } class Wind extends Instrument { // Redefine interface method: public void play(Note n) { System.out.println("Wind.play() : " + n.getValue()); } } public class Music { public static void tune(Instrument i) { // ... i.play(Note.MIDDLE_C); } public static void main(String[] args) { Wind flute = new Wind(); tune(flute); // Upcasting } } /** * Wind.play() : 0 */ //------------------------------------------------ //: c07:Shapes.java ポリモフィズムとは class Shape { void draw() { System.out.println("Shape.draw()"); } void erase() { System.out.println("Shape.draw()"); } } class Circle extends Shape { void draw() { System.out.println("Circle.draw()"); } void erase() { System.out.println("Circle.erase()"); } } class Square extends Shape { void draw() { System.out.println("Square.draw()"); } void erase() { System.out.println("Square.erase()"); } } class Triangle extends Shape { void draw() { System.out.println("Triangle.draw()"); } void erase() { System.out.println("Triangle.erase()"); } } public class Shapes { public static Shape randShape() { switch((int)(Math.random() * 3)) { default: case 0: return new Circle(); case 1: return new Square(); case 2: return new Triangle(); } } public static void main(String[] args) { Shape[] s = new Shape[9]; for(int i = 0; i < s.length; i++)// Fill up the array with shapes: { s[i] = randShape(); } for(int i = 0; i < s.length; i++)// Make polymorphic method calls: { s[i].draw(); } } } /** * Circle.draw() * Triangle.draw() * Circle.draw() * Circle.draw() * Circle.draw() * Square.draw() * Triangle.draw() * Square.draw() * Square.draw() */ //------------------------------------------------ //: c07:WindError.java // 引っかかるな ポリモフィズム2 class NoteX { public static final int MIDDLE_C = 0 ; C_SHARP = 1 ; C_FLAT = 2; } class InstrumentX { public void play(int NoteX) // This one { System.out.println("InstrumentX.play()"); } } class WindX extends InstrumentX { // OOPS! Changes the method interface: public void play(NoteX n) { System.out.println("WindX.play(NoteX n)"); } } public class WindError { public static void tune(InstrumentX i) { i.play(NoteX.MIDDLE_C);//MIDDLE_C = 0 ; } public static void main(String[] args) { WindX flute = new WindX(); tune(flute); // Not the desired behavior! } } /** * InstrumentX.play() */ //------------------------------------------------ //: c07:Sandwich.java コンストラクタからの呼び出し class Bread { Bread() { System.out.println("Bread()"); } } class Cheese { Cheese() { System.out.println("Cheese()"); } } class Lettuce { Lettuce() { System.out.println("Lettuce()"); } } class Meal { Meal() { System.out.println("Meal()"); } } class Lunch extends Meal { Lunch() { System.out.println("Lunch()");} } class PortableLunch extends Lunch { PortableLunch() {System.out.println("PortableLunch()"); } } class Sandwich extends PortableLunch { Bread b = new Bread(); Cheese c = new Cheese(); Lettuce l = new Lettuce(); Sandwich() { System.out.println("Sandwich()"); } public static void main(String[] args) { new Sandwich(); } } /** * Meal() * Lunch() * PortableLunch() * Bread() * Cheese() * Lettuce() * Sandwich() */ //------------------------------------------------ //: c07:PolyConstructors.java // extendsを考える abstract class Glyph { abstract void draw(); Glyph() { System.out.println("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()"); } } class RoundGlyph extends Glyph { int radius = 1; RoundGlyph(int r) { radius = r; System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius); } void draw() { System.out.println("RoundGlyph.draw(), radius = " + radius); } } public class PolyConstructors { public static void main(String[] args) { new RoundGlyph(5); } } /** * Glyph() before draw() * RoundGlyph.draw(), radius = 0 * Glyph() after draw() * RoundGlyph.RoundGlyph(), radius = 5 */ //------------------------------------------------ //: c07:Transmogrify.java new で自在に操る abstract class Actor { abstract void act(); } class HappyActor extends Actor { public void act() { System.out.println("HappyActor"); } } class SadActor extends Actor { public void act() { System.out.println("SadActor"); } } class Stage { Actor a = new HappyActor();// This one void go() { a.act(); } void change() { a = new SadActor(); // and this one! } } public class Transmogrify { public static void main(String[] args) { Stage s = new Stage(); s.go(); // Prints "HappyActor" s.change(); s.go(); // Prints "SadActor" } } /** * HappyActor * SadActor */ I-ichirow Suzuki _/_/_/_/_/_/_/_/_/_/_ URL : www.kg-group.com Top Page Mail : suzuki@kg-group.com /_/_/_/_/_/_/_/_/_/_/_/_ ICQ : 3743158