//: polymorphism/music/Wind.javapackagepolymorphism.music;// Wind objects are instruments// because they have the same interface:publicclassWindextendsInstrument{// Redefine interface method:publicvoidplay(Noten){System.out.println("Wind.play() "+n);}}///:~
//: polymorphism/shape/Shape.javapackagepolymorphism.shape;publicclassShape{publicvoiddraw(){}publicvoiderase(){}}///:~//: polymorphism/shape/Circle.javapackagepolymorphism.shape;import staticnet.mindview.util.Print.*;publicclassCircleextendsShape{publicvoiddraw(){print("Circle.draw()");}publicvoiderase(){print("Circle.erase()");}}///:~//: polymorphism/shape/Square.javapackagepolymorphism.shape;import staticnet.mindview.util.Print.*;publicclassSquareextendsShape{publicvoiddraw(){print("Square.draw()");}publicvoiderase(){print("Square.erase()");}}///:~//: polymorphism/shape/Triangle.javapackagepolymorphism.shape;import staticnet.mindview.util.Print.*;publicclassTriangleextendsShape{publicvoiddraw(){print("Triangle.draw()");}publicvoiderase(){print("Triangle.erase()");}}///:~//: polymorphism/shape/RandomShapeGenerator.java// A "factory" that randomly creates shapes.packagepolymorphism.shape;importjava.util.*;publicclassRandomShapeGenerator{privateRandomrand=newRandom(47);publicShapenext(){switch(rand.nextInt(3)){default:case0:returnnewCircle();case1:returnnewSquare();case2:returnnewTriangle();}}}///:~//: polymorphism/Shapes.java// Polymorphism in Java.importpolymorphism.shape.*;publicclassShapes{privatestaticRandomShapeGeneratorgen=newRandomShapeGenerator();publicstaticvoidmain(String[]args){Shape[]s=newShape[9];// Fill up the array with shapes:for(inti=0;i<s.length;i++)s[i]=gen.next();// Make polymorphic method calls:for(Shapeshp:s)shp.draw();}}/* Output:Triangle.draw()Triangle.draw()Square.draw()Triangle.draw()Square.draw()Triangle.draw()Square.draw()Triangle.draw()Circle.draw()*///:~
//: polymorphism/music3/Music3.java// An extensible program.packagepolymorphism.music3;importpolymorphism.music.Note;import staticnet.mindview.util.Print.*;classInstrument{voidplay(Noten){print("Instrument.play() "+n);}Stringwhat(){return"Instrument";}voidadjust(){print("Adjusting Instrument");}}classWindextendsInstrument{voidplay(Noten){print("Wind.play() "+n);}Stringwhat(){return"Wind";}voidadjust(){print("Adjusting Wind");}}classPercussionextendsInstrument{voidplay(Noten){print("Percussion.play() "+n);}Stringwhat(){return"Percussion";}voidadjust(){print("Adjusting Percussion");}}classStringedextendsInstrument{voidplay(Noten){print("Stringed.play() "+n);}Stringwhat(){return"Stringed";}voidadjust(){print("Adjusting Stringed");}}classBrassextendsWind{voidplay(Noten){print("Brass.play() "+n);}voidadjust(){print("Adjusting Brass");}}classWoodwindextendsWind{voidplay(Noten){print("Woodwind.play() "+n);}Stringwhat(){return"Woodwind";}}publicclassMusic3{// Doesn't care about type, so new types// added to the system still work right:publicstaticvoidtune(Instrumenti){// ...i.play(Note.MIDDLE_C);}publicstaticvoidtuneAll(Instrument[]e){for(Instrumenti:e)tune(i);}publicstaticvoidmain(String[]args){// Upcasting during addition to the array:Instrument[]orchestra={newWind(),newPercussion(),newStringed(),newBrass(),newWoodwind()};tuneAll(orchestra);}}/* Output:Wind.play() MIDDLE_CPercussion.play() MIDDLE_CStringed.play() MIDDLE_CBrass.play() MIDDLE_CWoodwind.play() MIDDLE_C*///:~
//: polymorphism/Sandwich.java// Order of constructor calls.packagepolymorphism;import staticnet.mindview.util.Print.*;classMeal{Meal(){print("Meal()");}}classBread{Bread(){print("Bread()");}}classCheese{Cheese(){print("Cheese()");}}classLettuce{Lettuce(){print("Lettuce()");}}classLunchextendsMeal{Lunch(){print("Lunch()");}}classPortableLunchextendsLunch{PortableLunch(){print("PortableLunch()");}}//先调用静态方法main() 再初始化字段publicclassSandwichextendsPortableLunch{privateBreadb=newBread();privateCheesec=newCheese();privateLettucel=newLettuce();publicSandwich(){print("Sandwich()");}publicstaticvoidmain(String[]args){newSandwich();}}/* Output:Meal()Lunch()PortableLunch()Bread()Cheese()Lettuce()Sandwich()*///:~
//: polymorphism/Frog.java// Cleanup and inheritance.packagepolymorphism;import staticnet.mindview.util.Print.*;classCharacteristic{privateStrings;Characteristic(Strings){this.s=s;print("Creating Characteristic "+s);}protectedvoiddispose(){print("disposing Characteristic "+s);}}classDescription{privateStrings;Description(Strings){this.s=s;print("Creating Description "+s);}protectedvoiddispose(){print("disposing Description "+s);}}classLivingCreature{privateCharacteristicp=newCharacteristic("is alive");//1 privateDescriptiont=newDescription("Basic Living Creature");//2LivingCreature(){print("LivingCreature()");//3}protectedvoiddispose(){print("LivingCreature dispose");t.dispose();p.dispose();}}classAnimalextendsLivingCreature{privateCharacteristicp=newCharacteristic("has heart");//4privateDescriptiont=newDescription("Animal not Vegetable");//5Animal(){print("Animal()");}//6 protectedvoiddispose(){print("Animal dispose");t.dispose();p.dispose();super.dispose();}}classAmphibianextendsAnimal{privateCharacteristicp=newCharacteristic("can live in water");// 7privateDescriptiont=newDescription("Both water and land");// 8Amphibian(){print("Amphibian()");//9}protectedvoiddispose(){print("Amphibian dispose");t.dispose();p.dispose();super.dispose();}}publicclassFrogextendsAmphibian{privateCharacteristicp=newCharacteristic("Croaks");//10privateDescriptiont=newDescription("Eats Bugs");// 11publicFrog(){print("Frog()");}//12protectedvoiddispose(){print("Frog dispose");//14t.dispose();//15p.dispose();//16super.dispose();}publicstaticvoidmain(String[]args){Frogfrog=newFrog();print("Bye!");//13frog.dispose();}}/* Output:Creating Characteristic is aliveCreating Description Basic Living CreatureLivingCreature()Creating Characteristic has heartCreating Description Animal not VegetableAnimal()Creating Characteristic can live in waterCreating Description Both water and landAmphibian()Creating Characteristic CroaksCreating Description Eats BugsFrog()Bye!Frog disposedisposing Description Eats Bugsdisposing Characteristic CroaksAmphibian disposedisposing Description Both water and landdisposing Characteristic can live in waterAnimal disposedisposing Description Animal not Vegetabledisposing Characteristic has heartLivingCreature disposedisposing Description Basic Living Creaturedisposing Characteristic is alive*///:~
//: polymorphism/PolyConstructors.java// Constructors and polymorphism// don't produce what you might expect.import staticnet.mindview.util.Print.*;classGlyph{voiddraw(){print("Glyph.draw()");}Glyph(){print("Glyph() before draw()");draw();//??为什么调用子类的方法print("Glyph() after draw()");}}classRoundGlyphextendsGlyph{privateintradius=1;RoundGlyph(intr){radius=r;print("RoundGlyph.RoundGlyph(), radius = "+radius);}voiddraw(){print("RoundGlyph.draw(), radius = "+radius);}}publicclassPolyConstructors{publicstaticvoidmain(String[]args){newRoundGlyph(5);}}/* Output:Glyph() before draw()RoundGlyph.draw(), radius = 0Glyph() after draw()RoundGlyph.RoundGlyph(), radius = 5*///:~
//: polymorphism/Transmogrify.java// Dynamically changing the behavior of an object// via composition (the "State" design pattern).import staticnet.mindview.util.Print.*;classActor{publicvoidact(){}}classHappyActorextendsActor{publicvoidact(){print("HappyActor");}}classSadActorextendsActor{publicvoidact(){print("SadActor");}}classStage{privateActoractor=newHappyActor();publicvoidchange(){actor=newSadActor();}publicvoidperformPlay(){actor.act();}}publicclassTransmogrify{publicstaticvoidmain(String[]args){Stagestage=newStage();stage.performPlay();stage.change();stage.performPlay();}}/* Output:HappyActorSadActor*///:~