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

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

練習1:(2)建立一個簡單的類。第二個類中,將一個引用定義為第一個類的物件。運用惰性初始化來例項化 這個物件。

public class Ja7_1{
    First f;
    First getFirst(){
        if(f==null){
            System.out.println("A Index Was Created");
            f=new First();
        }
        return f;//"return" can't be put into a "if{}".
    }
    public static void main(String[] args){
        Ja7_1 s=new Ja7_1();
        System.out.println(s.getFirst());
    }
}
class First{
    public String toString(){return "I am indexed";} //can't lose "public"
}
class Second{

}


在Ja7_1類中,首先定義了First類的一個引用f,而後只有在main()方法呼叫getFirst()方法時, f才會被例項化。為了觀察方便,在First類中寫了toString()方法,當列印First類的物件時,會預設輸出“I am indexed”。

值得注意的是:toString()方法一定要設成public。同時getFirst()中的return語句一定要在if語句之外。

練習2:(2)從Detergent中繼承產生一個新的類。覆蓋scrub()並新增一個名為sterilize()的新方法。

import static net.mindview.util.Print.*;

class Cleanser {
  private String s = "Cleanser";
  public void append(String a) { s += a; }
  public void dilute() { append(" dilute()"); }
  public void apply() { append(" apply()"); }
  public void scrub() { append(" scrub()"); }
  public String toString() { return s; }
  public static void main(String[] args) {
    Cleanser x = new Cleanser();
    x.dilute(); x.apply(); x.scrub();
    print(x);
  }
}	

class Detergent extends Cleanser {
  public void scrub() {
    append(" Detergent.scrub()");
    super.scrub(); 
  }
  public void foam() { append(" foam()"); }
  public static void main(String[] args) {
    Detergent x = new Detergent();
    x.dilute();
    x.apply();
    x.scrub();
    x.foam();
    print(x);
    print("Testing base class:");
    Cleanser.main(args);
  }	
} 

public class Ja7_2 extends Detergent{
    public void scrub(){
        append("Ja7_2.scrub()");
         super.scrub();
    }
    public void sterilize(){
            append("sterilize()");
    }
    public static void main(String[] args){
        Ja7_2 x=new Ja7_2();
        x.dilute();
        x.apply();
        x.scrub();
        x.foam();
        x.sterilize();
        print(x);
        print("Testing base class:");
        Detergent.main(args);
    }
}

練習5:(1)建立兩個帶有預設構造器(空引數列表)的類A和類B。從A中繼承產生一個名為C的新,並在C內建立一個B類的成員。不要給C編寫構造器。建立一個C類的物件並觀察其結果。

import static net.mindview.util.Print.*;
class A{
    public /*void*/ A(){
        print("A{}");
    }
}
class B{
    public /*void*/ B(){
        print("B{}");
    }
}
class C extends A{
    B b=new B();
    /*public  C(){
        print("C{}");
    }*/
}
public class Ja7_2_1{
    public static void main(String[] args){
        C c=new C();
    }
}
PS:為了自動呼叫A和B的構造器時能有print()輸出,則A()和B()方法的返回值不能是“void”,應該預設。

練習9:(2)建立一個Root類,令其含有名為Component1、Component 2、Component3的類的各一個例項(這些也由你寫)。從Root中派生一個類Stem,也含有上述各“組成部分”。所有的類都應帶有可打印出類的相關資訊的預設構造器。

import static net.mindview.util.Print.*;
class Root{
    Component1 c1=new Component1();
    Component2 c2=new Component2();
    Component3 c3=new Component3();
    public Root(){
    print("root");
    }
}
class Component1{
    public Component1(){
    print("c1");
    }
}
class Component2{
    public Component2(){
    print("c2");
    }
}
class Component3{
    public Component3(){
    print("c3");
    }
}
class Stem extends Root{
    Component1 c1=new Component1();
    Component2 c2=new Component2();
    Component3 c3=new Component3();
    public Stem(){
    print("stem");
    }
}
public class Ja7_2_9{
    public static void main(String[] args){
        Stem st=new Stem();
    }
}
/*output:
c1
c2
c3
root
c1
c2
c3
stem
 * */