您的位置:首页 > 编程语言 > Java开发

Java-Java编程思想第四版 第八章 练习

2018-02-09 17:56 471 查看
练习1:创建一个Cycle类,它具有子类Unicycle,Bicycle和TriCycle.演示每一个类型的实例都可以经由ride()向上转型为Cycle。import static net.mindview.util.Print.*;class Cycle{}class Unicycle extends Cycle{}class Bicycle extends Cycle{}class Tricycle extends Cycle{}public class Ja8_1_1{public static void ride(Cycle c){print("ride() method.");}public static void main(String[] args) {Unicycle uc=new Unicycle();Bicycle bc=new Bicycle();Tricycle tc=new Tricycle();Ja8_1_1.ride(uc);Ja8_1_1.ride(bc);Ja8_1_1.ride(tc);}}
练习2: 在几何图形的示例中添加@Override注解。import static net.mindview.util.Print.*;import java.util.*;class Shape {public void draw() {}public void erase() {}}class Square extends Shape {@Override public void draw() { print("Square.draw()"); }@Override public void erase() { print("Square.erase()"); }}class Triangle extends Shape {@Override public void draw() { print("Triangle.draw()"); }@Override public void erase() { print("Triangle.erase()"); }}class Circle extends Shape {@Override public void draw() { print("Circle.draw()"); }@Override public void erase() { print("Circle.erase()"); }}class RandomShapeGenerator {private Random rand = new Random(47);public Shape next() {switch(rand.nextInt(3)) {default:case 0: return new Circle();case 1: return new Square();case 2: return new Triangle();}}}public class Ja8_2_2{private static RandomShapeGenerator gen =new RandomShapeGenerator();public static void main(String[] args) {Shape[] s = new Shape[9];// Fill up the array with shapes:for(int i = 0; i < s.length; i++)s[i] = gen.next();// Make polymorphic method calls:for(Shape shp : s)shp.draw();}}练习3:在基类Shape().java中添加一个新方法,用于打印一条消息,但导出类中不要覆盖这个方法。请解释发生了什么。现在,在其中一个导出类中覆盖该方法,而在其他的导出类不予覆盖,观察又有什么发生。最后,在所有的导出类中覆盖这个方法。import static net.mindview.util.Print.*;import java.util.*;class Shape {public void newMethod(){print("I am a new method.");}public void draw() {}public void erase() {}}class Square extends Shape {@Override public void draw() { print("Square.draw()"); }@Override public void erase() { print("Square.erase()"); }@Override public void newMethod(){print("I am a new method of Square.");}}class Triangle extends Shape {@Override public void draw() { print("Triangle.draw()"); }@Override public void erase() { print("Triangle.erase()"); }@Override public void newMethod(){print("I am a new method of Triangle.");}}class Circle extends Shape {@Override public void draw() { print("Circle.draw()"); }@Override public void erase() { print("Circle.erase()"); }@Override public void newMethod(){print("I am a new method of Circle.");}}class RandomShapeGenerator {private Random rand = new Random(47);public Shape next() {switch(rand.nextInt(3)) {default:case 0: return new Circle();case 1: return new Square();case 2: return new Triangle();}}}public class Ja8_2_2{private static RandomShapeGenerator gen =new RandomShapeGenerator();public static void main(String[] args) {Shape[] s = new Shape[9];// Fill up the array with shapes:for(int i = 0; i < s.length; i++)s[i] = gen.next();// Make polymorphic method calls:for(Shape shp : s)shp.draw();for(Shape shp:s)shp.newMethod();}}练习4:向Shape.java中添加一个新的Shape类型,并在main()方法中验证:多态对新类型的作用是否与在旧类型中的一样。import static net.mindview.util.Print.*;import java.util.*;class Shape {public void newMethod(){print("I am a new method.");}public void draw() {}public void erase() {}}class Square extends Shape {@Override public void draw() { print("Square.draw()"); }@Override public void erase() { print("Square.erase()"); }@Override public void newMethod(){print("I am a new method of Square.");}}class Triangle extends Shape {@Override public void draw() { print("Triangle.draw()"); }@Override public void erase() { print("Triangle.erase()"); }@Override public void newMethod(){print("I am a new method of Triangle.");}}class Circle extends Shape {@Override public void draw() { print("Circle.draw()"); }@Override public void erase() { print("Circle.erase()"); }@Override public void newMethod(){print("I am a new method of Circle.");}}class Fang extends Shape {@Override public void draw() { print("Fang.draw()"); }@Override public void erase() { print("Fang.erase()"); }@Override public void newMethod(){print("I am a new method of Fang.");}}class RandomShapeGenerator {private Random rand = new Random();public Shape next() {switch(rand.nextInt(4)) {default:case 0: return new Circle();case 1: return new Square();case 2: return new Triangle();case 3: return new Fang();}}}public class Ja8_2_4{private static RandomShapeGenerator gen =new RandomShapeGenerator();public static void main(String[] args) {Shape[] s = new Shape[10];s[9]=new Fang();// Fill up the array with shapes:for(int i = 0; i < s.length; i++)s[i] = gen.next();// Make polymorphic method calls:for(Shape shp : s)shp.draw();for(Shape shp:s)shp.newMethod();}}练习7:想Music3.java添加一个新的类型Instrument,并验证多态性是否作用于所添加的新类型。import polymorphism.music.Note;import static net.mindview.util.Print.*;class Instrument {void play(Note n) { print("Instrument.play() " + n); }String what() { return "Instrument"; }void adjust() { print("Adjusting Instrument"); }}class Wind extends Instrument {void play(Note n) { print("Wind.play() " + n); }String what() { return "Wind"; }void adjust() { print("Adjusting Wind"); }}class Percussion extends Instrument {void play(Note n) { print("Percussion.play() " + n); }String what() { return "Percussion"; }void adjust() { print("Adjusting Percussion"); }}class Stringed extends Instrument {void play(Note n) { print("Stringed.play() " + n); }String what() { return "Stringed"; }void adjust() { print("Adjusting Stringed"); }}class Brass extends Wind {void play(Note n) { print("Brass.play() " + n); }void adjust() { print("Adjusting Brass"); }}class Woodwind extends Wind {void play(Note n) { print("Woodwind.play() " + n); }String what() { return "Woodwind"; }}class YangQin extends Instrument{void play(Note n) { print("YangQin.play() " + n); }String what() { return "YangQin"; }void adjust() { print("Adjusting YangQin"); }}public class Ja8_2_7 {// Doesn't care about type, so new types// added to the system still work right:public static void tune(Instrument i) {// ...i.play(Note.MIDDLE_C);}public static void tuneAll(Instrument[] e) {for(Instrument i : e)tune(i);}public static void main(String[] args) {// Upcasting during addition to the array:Instrument[] orchestra = {new YangQin(),new Wind(),new Percussion(),new Stringed(),new Brass(),new Woodwind()};tuneAll(orchestra);}}/*output:* YangQin.play() MIDDLE_CWind.play() MIDDLE_CPercussion.play() MIDDLE_CStringed.play() MIDDLE_CBrass.play() MIDDLE_CWoodwind.play() MIDDLE_C** */练习8:修改Music3.java,使其可以像Shapes.java中的方式那样可以随机创建Instrument对象import polymorphism.music.Note;import static net.mindview.util.Print.*;import java.util.*;class Instrument {void play(Note n) { print("Instrument.play() " + n); }String what() { return "Instrument"; }void adjust() { print("Adjusting Instrument"); }}class Wind extends Instrument {void play(Note n) { print("Wind.play() " + n); }String what() { return "Wind"; }void adjust() { print("Adjusting Wind"); }}class Percussion extends Instrument {void play(Note n) { print("Percussion.play() " + n); }String what() { return "Percussion"; }void adjust() { print("Adjusting Percussion"); }}class Stringed extends Instrument {void play(Note n) { print("Stringed.play() " + n); }String what() { return "Stringed"; }void adjust() { print("Adjusting Stringed"); }}class Brass extends Wind {void play(Note n) { print("Brass.play() " + n); }void adjust() { print("Adjusting Brass"); }}class Woodwind extends Wind {void play(Note n) { print("Woodwind.play() " + n); }String what() { return "Woodwind"; }}class YangQin extends Instrument{void play(Note n) { print("YangQin.play() " + n); }String what() { return "YangQin"; }void adjust() { print("Adjusting YangQin"); }}public class Ja8_2_8 {public static void tune(Instrument i) {i.play(Note.MIDDLE_C);}public static void tuneAll(Instrument[] e) {for(Instrument i : e)tune(i);}public static Instrument randIns(){Random rand=new Random();int i=rand.nextInt(6);switch(i){default:case 0:return new YangQin();case 1:return new Wind();case 2:return new Percussion();case 3:return new Stringed();case 4:return new Brass();case 5:return new Woodwind();}}public static void main(String[] args) {Instrument[] orchestra=new Instrument[6];for(int i=0;i<6;i++){orchestra[i]=Ja8_2_8.randIns();}tuneAll(orchestra);}}练习10: 创建一个包含两个方法的基类。在第一个方法中可以调用第二个方法。然后产生一个继承自该基类的导出类,且覆盖基类中的第二个方法。为该导出类创建一个对象,将他向上转型到基类并调用第一个方法,解释发生的情况。import static net.mindview.util.Print.*;class A{public void one(){print("A.one()");}public void two(){print("A.two()");}}class B extends A{public void two(){print("B.two()");}}public class Ja8_2_10{public static void three(A a){a.one();a.two();}public static void main(String[] args) {A b=new B();three(b);}}练习12:修改练习9,使其能够演示基类和导出类的初始化顺序。然后向基类和导出类中添加成员对象,并说明构造期间初始化发生的顺序。import static net.mindview.util.Print.*;public class Ja8_3_12{public static void main(String[] args) {Mouse m=new Mouse();}}class Rodent{private int k=printInit("in Rodent's data.");public Rodent(){System.out.println("I am Rodent().");}public void hop() {System.out.println("Rodent hopping");}public void scurry() {System.out.println("Rodent scurrying");}public void reproduce() {System.out.println("Making more Rodent");}public String toString() {return "Eodent";}static int printInit(String s) {print(s);return 47;}}class Mouse extends Rodent{private int k=printInit("in Mouse's data.");public Mouse(){System.out.println("I am Mouse().");}public void hop() {System.out.println("Mouse hopping");}public void scurry() {System.out.println("Mouse scurrying");}public void reproduce() {System.out.println("Making more Mice");}public String toString() {return "Mouse";}}class Gerbil extends Rodent{public void hop() {System.out.println("Gerbil hopping");}public void scurry() {System.out.println("Gerbil scurrying");}public void reproduce() {System.out.println("Making more Gerbil");}public String toString() {return "Gernil";}}class Hamster extends Rodent{public void hop() {System.out.println("Hamster hopping");}public void scurry() {System.out.println("Hamster scurrying");}public void reproduce() {System.out.println("Making more Hamster");}public String toString() {return "Hamster";}}练习13 : 在ReferenceCounting.java中添加一个finalized()方法,用来校验终止条件import static net.mindview.util.Print.*;class Shared {private int refcount = 0;private static long counter = 0;private final long id = counter++;public Shared() {print("Creating " + this);}public void addRef() { refcount++; }protected void dispose() {if(--refcount == 0)print("Disposing " + this);}public String toString() { return "Shared " + id; }protected void finalized(){if(refcount!=0)print("ERROR,Shared"+id+" isn't disposed.");}}class Composing {private Shared shared;private static long counter = 0;private final long id = counter++;public Composing(Shared shared) {print("Creating " + this);this.shared = shared;this.shared.addRef();}protected void dispose() {print("disposing " + this);shared.dispose();}public String toString() { return "Composing " + id; }}public class Ja8_3_13{public static void main(String[] args) {Shared shared = new Shared();Composing[] composing = { new Composing(shared),new Composing(shared), new Composing(shared),new Composing(shared), new Composing(shared) };for(Composing c : composing)c.dispose();}}修改练习12,使其某个成员对象变为具有引用计数的共享对象,并证明它可以正常运行。import static net.mindview.util.Print.*;public class Ja8_3_14{public static void main(String[] args) {Mouse m=new Mouse();Gerbil[] gb={new Gerbil(m),new Gerbil(m),new Gerbil(m),new Gerbil(m),};for(Gerbil g:gb){g.dispose();}}}class Rodent{//private int k=printInit("in Rodent's data.");//public Rodent(){System.out.println("I am Rodent().");}public void hop() {System.out.println("Rodent hopping");}public void scurry() {System.out.println("Rodent scurrying");}public void reproduce() {System.out.println("Making more Rodent");}public String toString() {return "Eodent";}static int printInit(String s) {print(s);return 47;}}class Mouse extends Rodent{private static int refcount=0;private static int count=0;private final int id=count++;public void refAdd(){refcount++;}protected void dispose(){if(--refcount==0)print("Disposing "+this);}public String toString(){return "Mouse "+id;}//private int k=printInit("in Mouse's data.");public Mouse(){print("Creating "+this);}public void hop() {System.out.println("Mouse hopping");}public void scurry() {System.out.println("Mouse scurrying");}public void reproduce() {System.out.println("Making more Mice");}}class Gerbil extends Rodent{private static int count=0;private final int id=count++;private Mouse m;public String toString(){return "Gerbil "+id;}public Gerbil(Mouse m){this.m=m; m.refAdd(); print("Creating "+this);}protected void dispose(){print("Disposing "+this);m.dispose();}public void hop() {System.out.println("Gerbil hopping");}public void scurry() {System.out.println("Gerbil scurrying");}public void reproduce() {System.out.println("Making more Gerbil");}}class Hamster extends Rodent{public void hop() {System.out.println("Hamster hopping");}public void scurry() {System.out.println("Hamster scurrying");}public void reproduce() {System.out.println("Making more Hamster");}public String toString() {return "Hamster";}}/*Creating Mouse 0Creating Gerbil 0Creating Gerbil 1Creating Gerbil 2Creating Gerbil 3Disposing Gerbil 0Disposing Gerbil 1Disposing Gerbil 2Disposing Gerbil 3Disposing Mouse 0*/练习15: 在PolyConstructors.java中添加一个RectangularGlyph,并证明会出现本节所描述的问题import static net.mindview.util.Print.*;class Glyph {void draw() { print("Glyph.draw()"); }Glyph() {print("Glyph() before draw()");draw();print("Glyph() after draw()");}}class RoundGlyph extends Glyph {private int radius = 1;RoundGlyph(int r) {radius = r;print("RoundGlyph.RoundGlyph(), radius = " + radius);}void draw() {print("RoundGlyph.draw(), radius = " + radius);}}class RectangularGlyph extends Glyph{private int rg=5;public RectangularGlyph(){print("RectangularGlyph.RectangularGlyph(),rg= "+rg);}void draw(){print("RectangularGlyph.draw(),rg="+rg);}}public class Ja8_3_15 {public static void main(String[] args) {new RectangularGlyph();}}练习16: 遵循Transmogrify.java这个例子,创建一个Starship类,包含一个AlertStatus引用,此引用可以指示三种不同的状态。纳入一些可以改变这些状态的方法import static net.mindview.util.Print.*;class Ship{public String toString(){return "Ship";}}class Enemy extends Ship{public String toString(){return "Enemy";}}class Friend extends Ship{public String toString(){return "Friend";}}class Lover extends Ship{public String toString(){return "Lover";}}class StarShip{private Ship star=new Ship();void first(){star=new Enemy();}void  second(){star= new Friend();}void third(){star= new Lover();}void show(){print(star);}}public class Ja8_5_16{public static void main(String[] args){StarShip ss=new StarShip();ss.first();ss.show();ss.second();ss.show();ss.third();ss.show();}}PS:toString()方法是对Object类中方法的重写,所以应当保持其public权限。练习17:使用练习1中的Cycle的层次结构哦,在Unicycle 和Bicycle中添加balance方法,而Tricycle中国不添加。创建这三种类型的实例,并将他们向上转型为Cycle数组。在该数组的每一个元素上都尝试调用balance,并观察结果。然后将他们向下转型,再次调用balance(),并观察将所发生什么。import static net.mindview.util.Print.*;class Cycle{void balance(){print("Cycle");}}class Unicycle extends Cycle{void balance(){print("Unicycle");}}class Bicycle extends Cycle{void balance(){print("Bicycle");}}class Tricycle extends Cycle{}public class Ja8_5_17{public static void ride(Cycle c){print("ride() method.");}public static void main(String[] args) {Cycle[] cs={new Unicycle(),new Bicycle(),new Tricycle(),new Cycle()};for(Cycle c:cs){c.balance();}((Bicycle)cs[1]).balance();((Unicycle)cs[0]).balance();((Tricycle)cs[2]).balance();((Bicycle)cs[3]).balance();}}/**UnicycleBicycleCycleCycleBicycleUnicycleCycleException in thread "main" java.lang.ClassCastException: Cycle cannot be cast toBicycle* */
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: