有秒計時的數字時鍾——mooc《面向對象程序設計——Java語言》-(浙大翁凱)第二周編程題


封裝,就是把數據和對這些數據的操作放在一起,並且用這些操作把數據掩蓋起來,是面向對象的基本概念之一,也是最核心的概念。

 

我們有一個非常直截了當的手段來保證在類的設計的時候做到封裝:

  1. 所有的成員變量必須是private的,這樣就避免別人任意使用你的內部數據;

  2. 所有public的函數,只是用來實現這個類的對象或類自己要提供的服務的,而不是用來直接訪問數據的。除非對數據的訪問就是這個類及對象的服務。簡單地說,給每個成員變量提供一對用於讀寫的get/set函數也是不合適的設計。

 

 

private:1:只有這個類內部可以訪問

              2:類內部指類的成員函數和定義初始化

              3:這個限制是對類的而不是對對象的

(同一個類的所有的不同的對象之間可以互相訪問別人的私有成員,私有是針對類而不是針對對象)

 

public:1:任何人都可以訪問

             2:任何人指的是在任何類的函數或定義初始化中可以使用

             3:使用指的是調用,訪問或定義變量

 

friendly:類的成員函數前面未說明是public或者private。則默認為friendly,意味着同一個包內可以訪問

 

一個編譯單元只能有一個public class

 

當你的程序越來越大的時候,你就會需要有一個機制幫助你管理一個工程中眾多的類了。包就是Java的類庫管理機制,它借助文件系統的目錄來管理類庫,一個包就是一個目錄,一個包內的所有的類必須放在一個目錄下,那個目錄的名字必須是包的名字。

 作為初學者,你可以忽略不看包,反正一切靠Eclipse。但是作為一個Java程序員,你不能不懂包。要不然,在使用別人的類庫和部署你的程序的時候,會遇到不少莫名其妙的麻煩。

 因為,包治百病啊!

 

類是描述,對象是實體。在類里所描述的成員變量,是位於這個類的每一個對象中的。

而如果某個成員有static關鍵字做修飾,它就不再屬於每一個對象,而是屬於整個類的了,名為類變量。

 通過每個對象都可以訪問到這些類變量和類函數,但是也可以通過類的名字來訪問它們。類函數由於不屬於任何對象,因此也沒有辦法建立與調用它們的對象的關系,就不能訪問任何非static的成員變量和成員函數了。static的初始化與對象的創建無關!

 

第二周編程題:

題目內容:

這一周的編程題是需要你在課程所給的時鍾程序的基礎上修改而成。但是我們並不直接給你時鍾程序的代碼,請根據視頻自己輸入時鍾程序的Display和Clock類的代碼,然后來做這個題目。

我們需要給時鍾程序加上一個表示秒的Display,然后為Clock增加以下public的成員函數:

 

public Clock(int hour, int minute, int second);

    用hour, minute和second初始化時間。

public void tick();

    “嘀嗒”一下,時間走1秒。

public String toString();

    返回一個String的值,以“hh:mm:ss“的形式表示當前時間。這里每個數值都占據兩位,不足兩位時補0。如“00:01:22"。注意其中的冒號是西文的,不是中文的。

 

提示:String.format()可以用和printf一樣的方式來格式化一個字符串。

 

另外寫一個Main類,它的main函數為下面的樣子,注意,必須原封不動地作為Main的main函數:

 

public static void main(String[] args) {

java.util.Scanner in = new java.util.Scanner(System.in);

Clock clock = new Clock(in.nextInt(), in.nextInt(), in.nextInt());

clock.tick();

System.out.println(clock);

in.close();

}

 

注意!在提交的時候,把Main、Clock和Display三個類的代碼合並在一起,其中Main類是public的,而Clock和Display類是沒有修飾符的。另外,千萬注意第一行不能有package語句。

 

輸入格式:

采用給定的main函數無需考慮輸入輸出。

 

輸出格式:

采用給定的main函數無需考慮輸入輸出。

 

輸入樣例:

采用給定的main函數無需考慮輸入輸出。

 

輸出樣例:

采用給定的main函數無需考慮輸入輸出。

時間限制:500ms內存限制:32000kb
 
代碼實現:
//單個時鍾計數器
class Display
{
    private int value=0;
    private int limit=0;
    //limit表示上限
    public Display(int limit) 
    {
        this.limit=limit;
    }
    //設置value值
    public void setValue(int value) {
        this.value=value;
    }
    //value先是不斷增加,等到達上限是value變為0
    public void increase() 
    {
        value++;
        if(value==limit)
        {
            value=0;
        }
        
    }
    //返回value值
    public int getValue() 
    {
        return value;
    }

}

//顯示時分秒的時鍾計數器
class Clock {
    private Display hour=new Display(24);//小時
    private Display minute=new Display(60);//分鍾
    private Display second=new Display(60);//秒鍾
    //通過Display中的setValue方法來設置value1值,用hour, minute和second初始化時間。
    public Clock(int hour,int minute,int second) {
        this.hour.setValue(hour);
        this.minute.setValue(minute);
        this.second.setValue(second);
    }
    //  “嘀嗒”一下,時間走1秒。
    public void tick() {
        second.increase();
        if(second.getValue()==0) {
            minute.increase();
            if(minute.getValue()==0)
            {
                hour.increase();
            }
        }
}
    //返回一個String的值,以“hh:mm:ss“的形式表示當前時間。這里每個數值都占據兩位,不足兩位時補0。如“00:01:22"。注意其中的冒號是西文的,不是中文的。
    //提示:String.format()可以用和printf一樣的方式來格式化一個字符串
    public String toString() {
        return(String.format("%02d:%02d:%02d",hour.getValue(),minute.getValue(),second.getValue()));
    }

}
public class SecondWeekday {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        java.util.Scanner in = new java.util.Scanner(System.in);
        Clock clock = new Clock(in.nextInt(), in.nextInt(), in.nextInt());
        clock.tick();
        System.out.println(clock);
        in.close();

    }

}

 補充:對於任何一個Java的類,只要去實現了public String toString()函數,就可以使用System.out.println()來輸出對象,會主動調用public String toString()函數。用這個函數產生的String來將其輸出。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM