//: reusing/Detergent.java// Inheritance syntax & properties.import staticnet.mindview.util.Print.*;classCleanser{privateStrings="Cleanser";publicvoidappend(Stringa){s+=a;}publicvoiddilute(){append(" dilute()");}publicvoidapply(){append(" apply()");}publicvoidscrub(){append(" scrub()");}publicStringtoString(){returns;}publicstaticvoidmain(String[]args){Cleanserx=newCleanser();x.dilute();x.apply();x.scrub();print(x);}}publicclassDetergentextendsCleanser{// Change a method:publicvoidscrub(){append(" Detergent.scrub()");super.scrub();// Call base-class version}// Add methods to the interface:publicvoidfoam(){append(" foam()");}// Test the new class:publicstaticvoidmain(String[]args){Detergentx=newDetergent();x.dilute();x.apply();x.scrub();x.foam();print(x);print("Testing base class:");Cleanser.main(args);}}/* Output:Cleanser dilute() apply() Detergent.scrub() scrub() foam()Testing base class:Cleanser dilute() apply() scrub()*///:~
//: reusing/Hide.java// Overloading a base-class method name in a derived// class does not hide the base-class versions.import staticnet.mindview.util.Print.*;classHomer{chardoh(charc){print("doh(char)");return'd';}floatdoh(floatf){print("doh(float)");return1.0f;}}classMilhouse{}classBartextendsHomer{voiddoh(Milhousem){print("doh(Milhouse)");}}publicclassHide{publicstaticvoidmain(String[]args){Bartb=newBart();b.doh(1);b.doh('x');b.doh(1.0f);b.doh(newMilhouse());}}/* Output:doh(float)doh(char)doh(float)doh(Milhouse)*///:~
//: reusing/Car.java// Composition with public objects.classEngine{publicvoidstart(){}publicvoidrev(){}publicvoidstop(){}}classWheel{publicvoidinflate(intpsi){}}classWindow{publicvoidrollup(){}publicvoidrolldown(){}}classDoor{publicWindowwindow=newWindow();publicvoidopen(){}publicvoidclose(){}}publicclassCar{publicEngineengine=newEngine();publicWheel[]wheel=newWheel[4];publicDoorleft=newDoor(),right=newDoor();// 2-doorpublicCar(){for(inti=0;i<4;i++)wheel[i]=newWheel();}publicstaticvoidmain(String[]args){Carcar=newCar();car.left.window.rollup();car.wheel[0].inflate(72);}}///:~
//: reusing/Orc.java// The protected keyword.import staticnet.mindview.util.Print.*;classVillain{privateStringname;protectedvoidset(Stringnm){name=nm;}publicVillain(Stringname){this.name=name;}publicStringtoString(){return"I'm a Villain and my name is "+name;}}publicclassOrcextendsVillain{privateintorcNumber;publicOrc(Stringname,intorcNumber){super(name);this.orcNumber=orcNumber;}publicvoidchange(Stringname,intorcNumber){set(name);// Available because it's protectedthis.orcNumber=orcNumber;}publicStringtoString(){return"Orc "+orcNumber+": "+super.toString();}publicstaticvoidmain(String[]args){Orcorc=newOrc("Limburger",12);print(orc);orc.change("Bob",19);print(orc);}}/* Output:Orc 12: I'm a Villain and my name is LimburgerOrc 19: I'm a Villain and my name is Bob*///:~
//: reusing/Wind.java// Inheritance & upcasting.classInstrument{publicvoidplay(){}staticvoidtune(Instrumenti){// ...i.play();}}// Wind objects are instruments// because they have the same interface:publicclassWindextendsInstrument{publicstaticvoidmain(String[]args){Windflute=newWind();Instrument.tune(flute);// Upcasting}}///:~
//: reusing/BlankFinal.java// "Blank" final fields.classPoppet{privateinti;Poppet(intii){i=ii;}}publicclassBlankFinal{privatefinalinti=0;// Initialized finalprivatefinalintj;// Blank finalprivatefinalPoppetp;// Blank final reference// Blank finals MUST be initialized in the constructor:publicBlankFinal(){j=1;// Initialize blank finalp=newPoppet(1);// Initialize blank final reference}publicBlankFinal(intx){j=x;// Initialize blank finalp=newPoppet(x);// Initialize blank final reference}publicstaticvoidmain(String[]args){newBlankFinal();newBlankFinal(47);}}///:~
//: reusing/FinalArguments.java// Using "final" with method arguments.classGizmo{publicvoidspin(){}}publicclassFinalArguments{voidwith(finalGizmog){//! g = new Gizmo(); // Illegal -- g is final}voidwithout(Gizmog){g=newGizmo();// OK -- g not finalg.spin();}// void f(final int i) { i++; } // Can't change// You can only read from a final primitive:intg(finalinti){returni+1;}publicstaticvoidmain(String[]args){FinalArgumentsbf=newFinalArguments();bf.without(null);bf.with(null);}}///:~
//: reusing/FinalOverridingIllusion.java// It only looks like you can override// a private or private final method.import staticnet.mindview.util.Print.*;classWithFinals{// Identical to "private" alone:privatefinalvoidf(){print("WithFinals.f()");}// Also automatically "final":privatevoidg(){print("WithFinals.g()");}}classOverridingPrivateextendsWithFinals{privatefinalvoidf(){print("OverridingPrivate.f()");}privatevoidg(){print("OverridingPrivate.g()");}}classOverridingPrivate2extendsOverridingPrivate{publicfinalvoidf(){print("OverridingPrivate2.f()");}publicvoidg(){print("OverridingPrivate2.g()");}}publicclassFinalOverridingIllusion{publicstaticvoidmain(String[]args){OverridingPrivate2op2=newOverridingPrivate2();op2.f();op2.g();// You can upcast:OverridingPrivateop=op2;// But you can't call the methods://! op.f();//! op.g();// Same here:WithFinalswf=op2;//! wf.f();//! wf.g();}}/* Output:OverridingPrivate2.f()OverridingPrivate2.g()*///:~
//: reusing/Jurassic.java// Making an entire class final.classSmallBrain{}finalclassDinosaur{inti=7;intj=1;SmallBrainx=newSmallBrain();voidf(){}}//! class Further extends Dinosaur {}// error: Cannot extend final class 'Dinosaur'publicclassJurassic{publicstaticvoidmain(String[]args){Dinosaurn=newDinosaur();n.f();n.i=40;n.j++;}}///:~