Java 習題4 答案及解析

問答題

(1)面嚮對象語言有哪三個特性?
(2)類名應當遵守怎樣的編程風格?
(3)變量和方法的名字應當遵守怎樣的編程風格?
(4)類體內容中聲明成員變量是爲了體現對象的屬性還是行爲?
(5)類體中定義的非構造方法是爲了體現對象的屬性還是行爲?
(6)什麼時候使用構造方法?構造方法有類型嗎?
(7)類中的實例變量在什麼時候會被分配內存空間?
(8)什麼叫方法的重載?構造方法可以重載嗎?
(9)類中的實例方法可以操作類變量(static變量)嗎?類方法(static方法)可以操作實例變量嗎?
(10)類中的實例方法可以用類名直接調用嗎?
(11)簡述類變量和實例變量的區別。
(12)this關鍵字代表什麼?this可以出現在類方法中嗎?


問答題解析

1.封裝、繼承和多態。
2.當類名由幾個單詞複合而成時,每個單詞的首字母使用大寫。
3.名字的首單詞的首字母使用小寫,如果變量的名字由多個單詞組成,從第2個單詞開始的其他單詞的首字母使用大寫。
4.屬性。
5.行爲。
6.用類創建對象時。沒有類型。
7.用類創建對象時。
8.一個類中可以有多個方法具有相同的名字,但這些方法的參數必須不同,即是參數的個數不同,或者是參數的類型不同。可以。
9.可以。不可以。
10.不可以。
11.一個類通過使用new運算符可以創建多個不同的對象,不同的對象的實例變量將被分配不同的內存空間。所有對象的類變量都分配給相同的一處內存,對象共享類變量。
12.代表調用當前方法的對象。不可以。


選擇題

(1) 下列哪個敘述是正確的?
A. Java應用程序由若干個類所構成,這些類必須在一個源文件中。
B. Java應用程序由若干個類所構成,這些類可以在一個源文件中,也可以分佈在若干個源文件中,其中必須有一個源文件含有主類。
C. Java源文件必須含有主類。
D. Java源文件如果含有主類,主類必須是public類。


(2) 下列哪個敘述是正確的?
A. 成員變量的名字不可以和局部變量的名字相同。
B. 方法的參數的名字可以和方法中聲明的局部變量的名字相同。
C. 成員變量沒有默認值。
D 局部變量沒有默認值.。


(3) 對於下列Hello類,哪個敘述是正確的?
A. Hello類有兩個構造方法。
B. Hello類的int Hello()方法是錯誤的方法。
C. Hello類沒有構造方法。
D. Hello無法通過編譯,因爲其中的hello方法的方法頭是錯誤的(沒有類型)

Java
class Hello{
    Hello (int m){
    }
    int Hello(){
        return 20;
    }
    hello(){
    }
}

(4)對於下列Dog類,哪個敘述是錯誤的?
A. Dog(int m)與Dog(double m)是互爲重載的構造方法。
B. int Dog(int m)與void Dog(double m)是互爲重載的非構造方法。
C. Dog類只有兩個構造方法,而且沒有無參數的構造方法。
D. Dog類有三個構造方法。

Java
class Dog{
    Dog(int m){
    }
    Dog(int double m){
    }
    int Dog(int m){
        return 23;
    }
    void Dog(double m){
    }
}

(5) 下列哪些類聲明是錯誤的?
A. class A
B. public class A
C. protected class A
D. private class A


(6) 下列A類中【代碼1】~【代碼5】哪些是錯誤的?

Java
class Tom{
    private int x = 120;
    protected int y = 20;
    int z = 11;
    private void f(){
        x = 200;
        System.out.println(x);
    }
    void g(){
    x = 200;
    System.out.println(x);
    }
}
public class A{
  public static void main(String args[]){
      Tom tom = new Tom();   
      tom.x = 22;             //【代碼1】
      tom.y = 33;             //【代碼2】
      tom.z = 55;             //【代碼3】
      tom.f();                //【代碼4】
      tom.g();                //【代碼5】

(7) 下列E類的類體中哪些【代碼】是錯誤的?

Java
classE{
    int x;
    long y = x;
    public void f(int n){
    int m;
    int t = n+m;
    }
}

選擇題解析

1.B
C選項中一個源文件可以沒有主類,但在一個應用程序(工程)下必須由一個主類
D選項如果若干源文件在同一個包下,主類可以不加public修飾。


2.D
B選項如果相同,那麼在方法內賦值操作就會混亂。
C選項成員變量都是有默認值的比如int 是0 double 是0.0 String 是null。而局部變量是沒有默認值的,所以在使用之前必須要進行初始化。


3.D
Hello只有一個構造方法,構造方法是沒有類型的,構造方法名必須和類名相同,故hello()不是構造方法,但他又沒有類型,不符合普通方法的規定,所以編譯會發生錯誤。


4.D
方法重載要求方法名相同,參數列表不同,可以是參數個數或者類型不同。構造方法也是可以重載的。Dog類有兩個構造方法(不帶類型的),而後兩個方法是互爲重載的非構造方法。


5.CD
類只能用public 修飾或者默認(友好)


6.【代碼1】【代碼4】
Tom類中的成員變量x是私有變量,不能直接使用對象調用。
f是私有方法,也不能直接使用對象調用
protect允許在同一個包中或者是子類調用


7.【代碼4】
m是局部變量,沒有默認值,所以在沒有初始化的前提下使用會報錯。


閱讀程序

(1) 說出下列E類中【代碼1】~【代碼3】的輸出結果。

Java
class Fish{
    int weight = 1;
}
class Lake{
    Fish fish;
    void setFish(Fish s){
        fish = s;
    }
    void foodFish(int m){
        fish.weight=fish.weight + m;
    }
}
public class E{
    public static void main(String args[]){
        Fish redFish = new Fish();
        System.out.println(redFish.weight);//【代碼1】
        Lake lake = new Lake();
        lake.setFish(redFish);
        lake.foodFish(120);
        System.out.println(redFish.weight);//【代碼2】
        System.out.prihtln(lake.fish.weight);//【代碼3】
    }
}

(2)請說出A類中System.out.println的輸出結果

Java
calss B{
    int x = 100, y = 200;
    public void setX(int x){
        x = x;
    }
    public void setY(int y){
        this.y=y;
    }
    public int getXYSum(){
        return x+y;
    }
}
public class A{
    public static void main(String args[]){
        B b = new B();
        b.setX(-100);
        b.setY(-200);
        System.out.println("sum="+b.getXYSum());
    }
}

(3)請說出A類中System.out.println的結果。

Java
class B{
    int n;
    static int sum = 0;
    void setN(int n){
        this.n = n;
    }
    int getSum(){
        for(int i=1;i<=n;i++)
            sum=sum+i;
        return sum;
    }
}
public class A{
    public static void main(String args[]){
    B b1 = new B(),b2=new B();
    b1.setN(3);
    b2.setN(5);
    int s1 = b1.getSum();
    int s2 = b2.getSum();
    System.out.println(s1+s2);

(4)請說出E類中【代碼1】和【代碼2】的輸出結果。

Java
class A{
    double f(int x,double y){
        return x+y;
    }
    int f(int x,int y){
        return x*y;
    }
}
public class E{
    public static void main(String args[]){
        A a = new A();
        System.out.println(a.f(10,10));//【代碼1】
        System.out.println(a.f(10,10.0));//【代碼2】
    }
}

閱讀程序題解析


1.【代碼1】:1,【代碼2】:121,【代碼3】:121。
redFish對象是Fish類的實例,所以具有Fish類的屬性,輸出的weight是1。
lake.setFish方法傳遞的是redFish對象,將redFish對象賦值給Lake中的fish對象,那麼二者就具有了相同的引用,從而具有完全相同的變量。那麼調用lake.foodFish(120)時,lake對象中的fish對象的weight就變成了121,而redFish和fish的引用相同,其變量也相同,所以redFish中的weight也同樣變成了121。


2.sum=-100
這道題涉及了this關鍵字的用法。
主類中聲明瞭B類的對象先調用setX方法傳遞參數爲-100,但在這個方法體中的語句爲x=x,等號右邊的x是傳遞進的參數,而等號左邊的x同樣也指這個參數,所以相當於把參數的值賦值給本身,是沒有任何意義的。
而調用setY方法,等號左邊是this.y指的就是當前類下的成員變量y,所以此時成員變量y被賦值爲-200,返回x+y的和就爲-100。


3.27
這道題考察類變量(static變量)
無論一個類實例了多少個對象,他們都共享類中的類變量。b1中的n是3,b2中的n是5,調用b1.getSum求和後得到的結果是1+2+3=6賦值給s1,由於sum是類變量,所以b2中的sum也是6,再調用b2.getsum求和,就是6+1+2+3+4+5=21賦值給了s2,此時b1中的sum也變成了21,最後輸出s1+s2的值就爲6+21=27。


4.【代碼1】100 【代碼2】20.0
這道題考察方法重載,方法重載要求方法名必須相同,參數列表不同(參數的個數不同或者是參數類型不同),【代碼1】傳遞的參數是兩個int變量10和10,那麼與int f(int x,int y)方法匹配,輸出結果100,【代碼2】傳遞的參數是int 10和double 10.0,和double f(int x, double y)匹配,輸出結果是20.0注意不能寫成20,返回的是double類型。


編程題

用類描述計算機中CPU的速度和硬盤的容量,要求Java應用程序由4個類,名字分別是PC、CPU、HardDisk、和Test,其中Test是主類。

  • PC類與CPU和HardDisk類關聯的UML圖
    其中,CPU類要求getSpeed()返回speed的值,要求setSpeed(int m)方法將參數m的值賦值給speed;HardDisk類要求getAmount()返回amount的值,要求setAmount(int m)方法將參數m的值賦值給amount;PC類要求setCPU(CPU c)將參數c的值賦值給CPU,要求setHardDisk(HardDisk h)方法將參數h的值賦值給HD,要求show()方法能顯示CPU的速度和硬盤的容量。
  • 主類Test的要求
    (1)main方法中創建一個CPU對象cpu,cpu將自己的speed設置爲2200.
    (2)main方法中創建一個HardDisk對象disk,disk將自己的amount設置爲200。
    (3)main方法中創建一個PC對象pc。
    (4)pc調用setCPU(CPU c)方法,調用時實參是cpu。
    (5)pc調用setHardDisk(HardDisk h)方法,調用時實參是disk。
    (6)pc調用show方法。
    這裏寫圖片描述
Java
public class CPU{
    int speed;
    int getSpeed(){
        return speed;
    }
    public void setSpeed(int speed){
        this.speed = speed;
    }
}
public class HardDisk{
    int amount;
    int getAmount(){
        return amount;
    }
    public void setAmount(int amount){
        this.amount = amount;
    }
}
public class PC{
    CPU cpu;
    HardDisk HD;
    void setCPU(CPU cpu){
        this.cpu = cpu;
    }
    void setHardDisk(HardDisk HD){
        this.HD = HD;
    }
    void show(){
        System.out.println("CPU速度:"+cpu.getSpeed());
        System.out.println("硬盤容量"+HD.getAmount());
    }
}
public class Test{
    public static void main(String args[]){
        CPU cpu = new CPU();
        HardDisk HD = new HardDisk();
        cpu.setSpeed(2200);
        HD.setAmount(200);
        PC pc = new PC();
        pc.setCPU(cpu);
        pc.setHardDisk(HD);
        pc.show();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章