封裝,就是把數據和對這些數據的操作放在一起,並且用這些操作把數據掩蓋起來,是面向對象的基本概念之一,也是最核心的概念。
我們有一個非常直截了當的手段來保證在類的設計的時候做到封裝:
-
所有的成員變量必須是private的,這樣就避免別人任意使用你的內部數據;
-
所有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函數無需考慮輸入輸出。
//單個時鍾計數器 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來將其輸出。