1. 程式人生 > >Java-Java程式設計思想第四版 第十章 練習

Java-Java程式設計思想第四版 第十章 練習

練習1:
/* Write a class named Outer that contains an inner class named Innet. 
* Add a method to Outer that returns an object of type Inner. In main(),
* create and initialize a reference to an Inner.
*/
import static net.mindview.util.Print.*;
class Outer{
    Inner out(){return new Inner();}
    class Inner{
        void in(){print("it's inner class");}
    }
}
public class Ja10_1_1{
    public static void main(String[] args){
        Outer ou=new Outer();
        Outer.Inner in=ou.out();
        in.in();
    }
}

練習2:

/* Create a class that holds a String, and has a toString() method that
* displays this String. Add several instances of your new class to a 
* Sequence ojbect, then display them.
*/
import static net.mindview.util.Print.*;
interface Selector{
    boolean end();
    void next();
    Object current();
}
class Word{
    private  String word;// this "word" can't be static. Or, the value can't be assigned!
    public Word(String s){word=s;}
    public String toString(){return word;}//toString must be public
}
public class Ja10_2_2{
    private Object[] aa;//it must be Object
    private static int i=0;
    private static int j=0;
    public Ja10_2_2(int size){aa=new Object[size];} //the size of Number array must be defined here.
    private class SequenceSelector implements Selector{
        public Object current(){return aa[j];}
        public void next(){j++;}
        public boolean end(){if(j<aa.length) return true; else{j=0;return false;} }
    }
    Selector selector(){return new SequenceSelector();}
    void add(Object s){//it must be Object
        if(i<aa.length){
        aa[i]=s;
        print(aa[1]);
        ++i;
        }
    }
    public static void main(String[] args){
        Ja10_2_2 ja=new Ja10_2_2(3);
        ja.add(new Word("aaaa"));
        ja.add(new Word("bbbb"));
        ja.add(new Word("cccc"));
        Selector sel=ja.selector();
        while(sel.end()){
            print(sel.current());
            sel.next();
        }
    }
}

PS:(1)變數aa必須定義成Object,這樣匯入引數時Word類可以向上轉型成Object,使toString()可以工作(2)toString()方法必須是public的(3)String word變數不能是static的,否則當它從aaaa變到cccc,指向它的a[0]~a[2]的陣列的值會全部變成cccc!(4)陣列的大小必須事前定義好(Ja-22-),否則會wei'l

練習3:

/* Modify Exercise 1 so that Outer has a private String field (initialized
* by the constructor), and Inner has a toString() that displays this field.
* Create an object of type Inner and display it.
*/
import static net.mindview.util.Print.*;
class Outer{
    private String ss;
    Inner out(){ss="dsaf"; return new Inner();}
    class Inner{
        public String toString(){return ss;}
        void in(){print("it's inner class");}
    }
}
public class Ja10_2_3{
    public static void main(String[] args){
        Outer ou=new Outer();
        Outer.Inner in=ou.out();
        print(in);
    }
}

練習4:

import static net.mindview.util.Print.*;
interface Selector {
  boolean end();
  Object current();
  void next();
  Ja10_3_4 infer();//!
}	

public class Ja10_3_4 {
  private Object[] items;
  private int next = 0;
  public Ja10_3_4(int size) { items = new Object[size]; }
  public void add(Object x) {
    if(next < items.length)
      items[next++] = x;
  }
  private class SequenceSelector implements Selector {
    private int i = 0;
    public boolean end() { return i == items.length; }
    public Object current() { return items[i]; }
    public void next() { if(i < items.length) i++; }
    public Ja10_3_4 infer(){return Ja10_3_4.this;}//!
  }
  public Selector selector() {
    return new SequenceSelector();
  }	
  public void outerInferred(){print("Ja10_3_4 inferred.");}
  public static void main(String[] args) {
    Ja10_3_4 sequence = new Ja10_3_4(10);
    for(int i = 0; i < 10; i++)
      sequence.add(Integer.toString(i));
    Selector selector = sequence.selector();
    selector.infer().outerInferred();//!
    while(!selector.end()) {
      System.out.print(selector.current() + " ");
      selector.next();
    }
  }
} 

PS://!處,為新增程式碼

練習5:

import static net.mindview.util.Print.*;
class Outer{
    class Inner{
        Inner(){print("adsf");}
    }
}
public class Ja10_3_5{
    public static void main(String[] args){
       Outer ou=new Outer();
       Outer.Inner in=ou.new Inner();
    }
}

練習6:

import net.mindview.simple.*;
/*interface Ja10_4_6a{
    void f();
}*/
/*class Ja10_4_6b{
    class Ja10_4_6c implements Ja10_4_6a{
        public void f(){System.out.println("It's Ja10_4_6b");}

    }
}*/
public class Ja10_4_6 extends Ja10_4_6b{
    public static void main(String[] args){
        Ja10_4_6b ja=new Ja10_4_6b();
        Ja10_4_6a jac=ja.new Ja10_4_6c();
        jac.f();
    }
}

練習7:

import static net.mindview.util.Print.*;
class Ja10_4_7a{
    private int i=5;
    private void outMethod(){print("It's method of outer");}
    class Ja10_4_7b{
        void f(){i=3;print(i);}
        void inMethod(){outMethod();}
    }
}
public class Ja10_4_7{
    public static void main(String[] args){
        Ja10_4_7a jaa=new Ja10_4_7a();
        Ja10_4_7a.Ja10_4_7b jab=jaa.new Ja10_4_7b();
        jab.f();
        jab.inMethod();
    }
}

練習9:

/* Create an interface with at least one method, and implement that
* interface by defining an inner class within a method, which returns a
* reference to your interface.
*/
import static net.mindview.util.Print.*;
interface A{
    void f();
}
public class Ja10_5_9{
    A outMethod1(){
        class B implements A{
            public void f(){
                print("it's B implements A.f()");
            }
        }
        return new B();
    }
    public static void main(String[] args){
        Ja10_5_9 ja=new Ja10_5_9();
        A a=ja.outMethod1();
        a.f();
    }
}

練習11:

/* Create a private inner class that implements a public interface.
* Write a method that returns a reference to an instance of the private
* inner class, upcast to the interface. Show that the inner class is 
* completely hidden by trying to downcast to it.
*/

import static net.mindview.util.Print.*;
 interface A{void f();}
/*public class Ja10_5_11{
    A forReturn(){
        private class B implements A{
            public void f(){print("It's Ja10_5_11.B.f()");}
        }
        return new B();
    }
    public static void main(String[] args){
        Ja10_5_11 ja=new Ja10_5_11();
        A a=ja.forReturn();
        a.f();
    }
}*/
class C{
    private class B implements A{
        public void f(){print("It's Ja10_5_11.B.f()");}
    }
    A forReturn(){return new B();}
}
public class Ja10_5_11{
    public static void main(String[] args){
        C c=new C();
        A a=c.forReturn();
        a.f();

        //!B b=(B)a;
        //!b.f();
    }
}

PS: 方法內部的內部類,不能設成private?

練習12:

/* Repeat Exercise 7 using an anonymous inner class.
* (Exercise 7: Create a class with a private field and a private method. 
* Create an inner class with a method that modifies the outer-class field  
* and calls the outer class method. In a second outer-class method, create
* an object of the inner class and call its method, then show the effect on
* the outer-class object.) 
*/
import static net.mindview.util.Print.*;
interface  Ja10_4_7b{
    void f();
    void inMethod();
}

class Ja10_4_7a{
    private int i=5;
    private void outMethod(){print("It's method of outer");}
    Ja10_4_7b bb(){
        return new Ja10_4_7b(){
            private int j=5;
            private void bb(){print(j);}
            {print(j);}
            public void f(){i=3;print(i);}
            public void inMethod(){outMethod();}
        };
    }
}
public class Ja10_6_12{
    public static void main(String[] args){
        Ja10_4_7a jaa=new Ja10_4_7a();
        jaa.bb();
    }
}

練習13:

/* Repeat Exercise 9 using an anonymous inner class.
* (Exercise 9: Create an interface with at least one method, and implement
* that interface by defining an inner class within a method, which returns
* a reference to your interface.) 
*/
import static net.mindview.util.Print.*;
interface A{
    void f();
}
public class Ja10_6_13{
    A outMethod1(){
        return new A(){
            {print("it's inner class A");}
            public void f(){
                print("it's B implements A.f()");
            }
        };
    }
    public static void main(String[] args){
        Ja10_6_13 ja=new Ja10_6_13();
        A a=ja.outMethod1();
        a.f();
    }
}

練習14:

/* Modify interfaces/HorrorShow.java to implement DangerousMonster and
* Vampire using anonymous classes.
*/
interface Monster {
  void menace();
}

interface DangerousMonster extends Monster {
  void destroy();
}

interface Lethal {
  void kill();
}

interface Vampire extends DangerousMonster, Lethal {
  void drinkBlood();
}

public class Ja10_6_14 {
  static void u(Monster b) { b.menace(); }
  static void v(DangerousMonster d) {
    d.menace();
    d.destroy();
  }
  static void w(Lethal l) { l.kill(); }
  DangerousMonster monster(){
      return new DangerousMonster(){ 
        public void menace() {}
        public void destroy() {}
    };
  }
  Vampire vampire(){
    return new Vampire(){
        public void menace() {}
        public void destroy() {}
        public void kill() {}
        public void drinkBlood() {}
    };
  }
  public static void main(String[] args) {
      Ja10_6_14 ja=new Ja10_6_14();
    DangerousMonster barney =ja.monster();
    u(barney);
    v(barney);
    Vampire vlad =ja.vampire();
    u(vlad);
    v(vlad);
    w(vlad);
  }
} 

練習15:

/* Create a class with a non-default constructor and no default constructor.
* Create a second class that has a method that returns a reference to an
* object of the first class. Create the object that you return by making an
* anonymous inner class that inherits from the first class. 
*/
import static net.mindview.util.Print.*;
abstract class A{
    void a(int i){}
}
class C extends A{}
class B{
    A returnInner(final int i){
        return new C(){
            //private int ii=i;
            void a(int ii){print("It's B.C.a("+ii+")");}
        };
    }
}
public class Ja10_6_15{
    public static void main(String[] args){
        B b=new B();
        b.returnInner(5).a(8);
    }
}

練習16:

/* Modify the solution to Exercise 18 from the Interfaces chapter to use
* anonymous inner classes.
* (Exercise 18, Interface: Create a Cycle interface, with implementations
* Unicycle, Bicycle and Tricycle. Create factories for each type of Cycle,
* and code that uses these factories.
*/
import static net.mindview.util.Print.*;
interface Cycle{void produce();}
interface CycleFactory{Cycle getCycle();}
class Unicycle implements Cycle{
    public void produce(){print("it's Unicycle");}
    public static CycleFactory factory=new CycleFactory(){
        public Cycle getCycle(){return new Unicycle();}
    };
    
}
class Bicycle implements Cycle{
    public void produce(){print("it's Bicycle");}
    public static CycleFactory factory=new CycleFactory(){
        public Cycle getCycle(){
            return new Bicycle();
        }  
    };
}
class Tricycle implements Cycle{
    public void produce(){print("it's Tricycle");}
    public static CycleFactory factory=new CycleFactory(){
        public Cycle getCycle(){return new Tricycle();}
    };
}
public class Ja10_6_16{
    static void make(CycleFactory cf){
        Cycle c=cf.getCycle();
        c.produce();
    }
    public static void main(String[] args){
        make(Unicycle.factory);
        make(Bicycle.factory);
        make(Tricycle.factory);
    }
}


練習18:

/* Create a class containing a nested class. In main(), create an instance of
* the nested class.
*/
class C{
     class D{}
}
public class Ja10_6_18{
    static class B{
        
    }
    class A{}
    public static void main(String[] args){
        B b=new B();
        //!A a=new A();
        
        Ja10_6_18 ja=new Ja10_6_18();
        A a=ja.new A();

        C c=new C();
        C.D d=c.new D();
    }
}

練習19:

/* Create a class containing an inner class that itself contains an inner
* class. Repeat this using nested classes. Note the names of the .class files
* produced by the compiler.
*/

import static net.mindview.util.Print.*;
public class Ja10_6_19{
    private static class A{
        private static class B{
            void f(){print("It's Ja10_6_19.A.B");}
        }
    }
    public static void main(String[] args){
        A.B b=new A.B();
        b.f();
    }
}

練習20:

/* Create an interface containing a nested class. Implement this interface and 
* create an instance of the nested class.
*/
import static net.mindview.util.Print.*;
public interface Ja10_7_20{
    void f();
    class B implements Ja10_7_20{
        public void f(){print("sds");}
        public static void main(String[] args){
            B b=new B();
            b.f();
        }
    }
}

練習21:

/* Create an interface that contains a nested class that has a static method that
* calls the methods of your interface and displays the results. Implement your
* interface and pass an instance of your implementation to the method. 
*/
import static net.mindview.util.Print.*;
interface A{
    public void f();
    public static class B{
        static void ff(Ja10_7_21 i){
            print(i);
        }
    }
}
public class Ja10_7_21 implements A{
    public void f(){print("sooos");}
    public static void main(String[] args){
        Ja10_7_21 ja=new Ja10_7_21();
        A.B.ff(ja);
    }
}

PS:知道了呼叫方法ff(),只需引用A.B.ff()。B和f()都是靜態的

練習22:

interface Selector {
  boolean end();
  Object current();
  void next();
}	

public class Ja10_8_22{
  private Object[] items;
  private int next = 0;
  public Ja10_8_22(int size) { items = new Object[size]; }
  public void add(Object x) {
    if(next < items.length)
      items[next++] = x;
  }
  private class SequenceSelector{ 
    Selector forwardSelector(){
         return new Selector() {
            private int i = 0;
            public boolean end() { return i == items.length; }
            public Object current() { return items[i]; }
            public void next() { if(i < items.length) i++; }
        };
    }
    Selector reverseSelector(){
         return new Selector() {
            private int i = items.length-1;
            public boolean end() { return i == -1; }
            public Object current() { return items[i]; }
            public void next() { if(i > -1) i--; }//[0,length-1]
        };
    
    }
  }
  public Selector selector(int i) {
    if(i==1){return new SequenceSelector().forwardSelector();}
    else{return new SequenceSelector().reverseSelector();}
  }	
  public static void main(String[] args) {
    Ja10_8_22 sequence = new Ja10_8_22(10);
    for(int i = 0; i < 10; i++)
      sequence.add(Integer.toString(i));
    Selector selector = sequence.selector(0);
    while(!selector.end()) {
      System.out.print(selector.current() + " ");
      selector.next();
    }
  }
}

練習23:

/* Create an interface U with three methods. Create a class A with a method that
* produces a reference to a U by building an anonymous inner class. Create a second
* class B that contains an array of U. B should have one method that accepts and 
* stores a reference to U in the array, a second method that sets a reference in
* the array (specified by the method argument) to null, and a third method that
* moves through the array and calls the methods in U. In main, create a group of A 
* objects and a single B. Fill the B with U references produced by the A objects. 
* Use the B to call back into all the A objects. Remove some of the U references
* from the B.
*/
import static net.mindview.util.Print.*;
interface U{void a();void b();void c();}
class A{
    U aA(){
        return new U(){
            public void a(){print("A.a()");}
            public void b(){print("A.b()");}
            public void c(){print("A.c()");}
        };
    }
}
class B{
    private U[] us;
    B(int i){us=new U[i];}
    void addU(U u, int i){
        us[i]=u;
    }
    void eraseU(int i){us[i]=null;}
    void testUs(){for(U u:us){u.a(); u.b(); u.c();}}
}
public class Ja10_8_23{
    public static void main(String[] args){
    B bb=new B(5);
    for(int i=0;i<5;i++){
        A aa=new A();
        bb.addU(aa.aA(),i);
    }
    //bb.testUs();
    bb.eraseU(3);
    bb.eraseU(1);
    bb.testUs();
    }
}

練習24:

/* In GreenhouseControls.java, add Event inner classes that turn fans on and
* off. Configure GreenhouseController.java to use these new Event objects.
*/
import innerclasses.*;
import innerclasses.controller.*;

public class Ja10_8_24 {
  public static void main(String[] args) {
    GreenhouseControls gc = new GreenhouseControls();
    // Instead of hard-wiring, you could parse
    // configuration information from a text file here:
    gc.addEvent(gc.new Bell(900));
    Event[] eventList = {
      gc.new ThermostatNight(0),
      gc.new LightOn(200),
      gc.new LightOff(400),
      gc.new WaterOn(600),
      gc.new WaterOff(800),
      gc.new ThermostatDay(0),
      gc.new FanOn(0),
      gc.new FanOff(0)
    };	
    gc.addEvent(gc.new Restart(2000, eventList));
      gc.addEvent(
        new GreenhouseControls.Terminate(
          2000));
    gc.run();
  }
} /* Output
*///:~

練習25:

/* Inherit from GreenhouseControls in GreenhouseControls.java to add Event
* inner classes that turn water mist generators on and off. Write a new
* version of GreenhouseController.java to use these new Event objects.
*/
import innerclasses.*;
import innerclasses.controller.*;
class GreenhouseControls2 extends GreenhouseControls{
    private boolean jet=false;
    public class JetOn extends Event{
        public JetOn(long delayTime){super(delayTime);}
        public void action(){jet=true;}
        public String toString(){return "Jet is on.";}
    }
    public class JetOff extends Event{
        public JetOff(long delayTime){super(delayTime);}
        public void action(){jet=false;}
        public String toString(){return "Jet is false.";}
    }
}
public class Ja10_8_25 {
  public static void main(String[] args) {
    GreenhouseControls2 gc = new GreenhouseControls2();
    // Instead of hard-wiring, you could parse
    // configuration information from a text file here:
    gc.addEvent(gc.new Bell(900));
    Event[] eventList = {
      gc.new ThermostatNight(0),
      gc.new LightOn(200),
      gc.new LightOff(400),
      gc.new WaterOn(600),
      gc.new WaterOff(800),
      gc.new ThermostatDay(0),
      gc.new FanOn(0),
      gc.new FanOff(0),
      gc.new JetOn(0),
      gc.new JetOff(0)
    };	
    gc.addEvent(gc.new Restart(2000, eventList));
      gc.addEvent(
        new GreenhouseControls.Terminate(
          2000));
    gc.run();
  }
}

練習26:

/* Create a class with an inner class that has a non-default constructor
* (one that takes arguments). Create a second class with an inner
* class that inherits from the first inner class.
*/

import static net.mindview.util.Print.*;
class A{
    class inA{
        inA(){print("A.inA()");}
    }
}
class B{
    class inB extends A.inA{
        inB(A a){a.super();}
    }
}
public class Ja10_8_26{
    public static void main(String[] args){
        A a=new A();
        B b=new B();
        B.inB inb=b.new inB(a);
    }
}