就個人銀行賬戶管理程式談談C++和Java的異同
4_9
同:
- Java和C++都是面向物件的語言。都有資料成員,方法,訪問許可權的概念。
異:
訪問許可權上,非private時Java的預設訪問許可權是包。而C++的預設訪問許可權是private。Java中:訪問許可權首先看類前的修飾符,當類的修飾符為public時,
則類可以被所有的類所訪問(可以import),當為預設時,
則只能為包中的類所訪問。在此前提下,再看屬性和方法前的修飾符。類前修飾符為public時,當屬性和方法前的修飾符為public時,則該屬性可以被所有類訪問;當屬性和方法前為protected修飾時,對於類定義而言,可以被同包中的類和所有子類訪問(子類和父類可以不在同一個包中),也就是B+C範圍,但對於物件而言,只能被同一個包的類物件所訪問,也就是B的範圍;當為預設時,只能被同包中的類所訪問(比protected訪問許可權小);當為private時,只能被本類內部所訪問 。
宣告訪問許可權時,C++可以用冒號統一宣告,而Java則不行,得一一列舉。
Java呼叫非靜態方法和非靜態資料成員時,是用物件引用呼叫的,每個物件引用都需要先new一下,指向物件空間。而C++是用物件例項呼叫非靜態方法和非靜態資料成員的。
Java都是一個類為單元,方法和主函式都寫在類裡面。C++則可以先宣告一個類,再在外面具體實現,必須有main函式為入口執行。
Java呼叫方法和資料成員都是用訪問操作符(.)。而C++可以用(.)和(->)。C++中有指標的概念,Java中沒有指標的概念。
修飾方法為常量屬性時,C++是在方法後加const,如:
double accumulate(int date) **const** { return accumulation + balance * (date - lastDate); }
private **final** double accumulate(int date) { return accumulation + balance * (date - lastDate);}
。修飾資料成員為常量屬性時,則都在前面新增相應的修飾。Java每個包的檔名和主類的名字必須相同。而C++則不一定。
5_11
同:
- Java和C++類和物件都可以訪問靜態資料成員和靜態方法。
異:
- Java中的靜態資料成員可以在類中初始化,如果沒有初始化,則預設為0;而C++的靜態資料成員不能在類中初始化。C++的靜態成員函式在類外實現時候無須加static關鍵字,否則是錯誤的。
- 靜態成員之間可以相互訪問,包括靜態成員函式訪問靜態資料成員和訪問靜態成員函式;非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員;靜態成員函式不能訪問非靜態成員函式和非靜態資料成員;
- C++實現自定義多檔案,是用include匯入,一般用#ifndef DATE_H
#define DATE_H,#endif的形式匯出。必須匯入.h結尾的檔案,不過實現可以在一個新的檔案中實現。而Java有project、module、package的概念。不同package之間可以通過package a,和import a.類名匯入匯出實現多檔案。匯出的類必須宣告為public訪問許可權,否則匯出無效,不能被其他檔案訪問。
6_25
同:
- 都可以使用物件陣列和字元陣列。
異:
- C++實現物件陣列,可以直接用例項物件初始化陣列。如:
SavingsAccount accounts[] = { SavingsAccount(date, "S3755217", 0.015), SavingsAccount(date, "02342342", 0.015) };
而Java必須new出物件初始化物件陣列。如:SavingsAccount accounts[] = { new SavingsAccount(date, "S3755217", 0.015), new SavingsAccount(date, "02342342", 0.015)};
- Java中的陣列宣告不可在方括號內指定陣列大小,如int[10]arr,但C++可以;
- C++中的字串可以用字元陣列實現或者string(小寫s)STL類模板。而Java字串可以用字元陣列,還有String(S大寫),StringBuffer,StringBuilder類庫。
- C++裡的if括號裡的條件判斷非0即真,0即假。而Java中的if括號裡的條件判斷必須為布林值,而不能為算術值,如while(y--){x--;}是錯誤的。
- Java中普通資料型別作為引數傳遞時是值傳遞,而物件作為引數時,傳遞的是物件的地址,物件是引用傳遞。而C++物件例項作為引數傳遞時是值傳遞,C++的引用傳遞需要加上&修飾,變成一個引用型別。
7_10
同:
- Java和C++都有封裝,繼承,多型(過載和覆蓋)。
- private修飾的屬性成員或方法都不能被子類訪問。
- 都有this
異:
- C++中繼承父類是在子類的聲明後面用冒號:的形式繼承。如:
class SavingsAccount : public Account{};
。而Java使用extends關鍵字實現繼承。如:public class SavingsAccount extends Account {}
。 C++中分為公有繼承,私有繼承和保護繼承。 而Java中,子類繼承了父類的所有屬性和方法, 但只有public、protected的屬性和方法在子類是可見的。子類在繼承父類的時候,首先應該滿足父類可被訪問,例如當子類和父類不在同一個包當中時,父類修飾符必為public;在父類能被訪問的前提下,凡是修飾符為public或是protected的父類屬性成員或是方法能被子類所訪問;private的屬性成員或是方法則不能被訪問。
- Java中this有三個用法,1. 表示當前物件引用 。2.表示當前物件 。3.呼叫當前類的構造方法 。而C++中沒有用法3,有用法1,2。
Java中super訪問當前類的直接父類。用法有兩點。1.子類的資料成員或成員方法與父類的資料成員或成員方法名字相同時,當要呼叫父類的同名方法或同名數據成員時則可用super來指明。即super.資料成員;super.成員方法。2.super(引數) , 表示呼叫父類構造方法。如:
public CreditAccount(final Date date, final String id, double credit, double rate, double fee){ super(date,id); this.credit=credit; this.rate=rate; this.fee=fee; this.acc=new Accumulator(date,0);}
,再如:public void show(){ **super.show();** System.out.println("\tAvailable credit:" + getAvailableCredit());}.
8_8
同:
- C++和Java中在多型中都有過載,覆蓋(重寫)的概念。
異:
C++中,幾個概念的區別:即過載,重寫(覆蓋),以及重定義(同名隱藏)。 過載:指在同一作用域中允許有多個同名函式,而這些函式的引數列表不同,包括引數個數不同,型別不同,次序不同,需要注意的是返回值相同與否並不影響是否過載。重寫(覆蓋)和重定義(同名隱藏)則有點像,區別就是在寫重寫的函式是否是虛擬函式,只有重寫了虛擬函式的才能算作是體現了C++多型性,否則即為重定義,在之前的程式碼中,我們看到子類繼承了基類的函式,若是子類(派生類)沒有函式,依舊會呼叫基類的函式,若是子類已重定義,則呼叫自己的函式,這就叫做同名隱藏。 1. 1. 虛擬函式:是在基類中使用關鍵字 virtual 宣告的函式。在派生類中重新定義基類中定義的虛擬函式時,會告訴編譯器不要靜態連結到該函式。
我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態連結,或後期繫結。
2.純虛擬函式:想要在基類中定義虛擬函式,以便在派生類中重新定義該函式更好地適用於物件,但是您在基類中又不能對虛擬函式給出有意義的實現,這個時候就會用到純虛擬函式。
Java中,多型是指一個程式中同名的不同方法共存的情況。提供兩種多型的機制:過載(overloading)與覆蓋(overriding)。過載:方法名稱相同,引數型別或個數不同。注意:若方法名稱相同,引數相同,僅有返回型別不同,則編譯不能通過。
//過載 class Parent{ public int getScore(){ return 3; } public int getScore(int i){ return i; } }
覆蓋:子類對父類的同名方法(方法名稱相同,引數相同,返回型別相同)重新進行定義,即在子類中定義與父類中已定義的同名而內容不同的方法。
覆蓋與過載的區別:
覆蓋:方法名稱相同,引數相同,返回型別相同
過載:方法名稱相同,引數型別或個數不同
在Java中,覆蓋需要注意的地方:
子類的訪問修飾符許可權應等於或大於父類
- 同名的static方法和非static方法不能相互覆蓋
- 方法前有final修飾符,此方法不能在子類方法中進行覆蓋
- 在JDK中,很多父類的方法被子類重新覆蓋,賦予了不同的含義,如Object類中的boolean equals(Object obj)方法
抽象類中如果存在抽象方法,則具體子類必須對抽象方法進行覆蓋
9_16
同:
- C++引入類模板的概念,編譯器從類模板可以自動生成多個類,避免了程式設計師的重複勞動。 而與之對應的,Java中也有泛型的概念。
異:
此係統中,C++自己實現了一個模板類Array,而Java可以直接用ArratList的泛型類 。
ArrayList
相當於C++ 的vector
,用於儲存物件。與陣列不同,陣列一旦建立,長度固定,但是ArrayList
的長度是動態的,不受限制,可以儲存任意多的物件,但是隻能儲存物件,不能儲存原生資料型別例如int
。ArrayList <Account> accounts=new ArrayList(); accounts.add(new SavingsAccount(date, id, rate)); accounts.add(new CreditAccount(date, id, credit,rate,fee));
從鍵盤中輸入的區別, C++給我們提供的cin()獲取鍵盤輸入值的現成函式,Java中三種方法(作者剛入門Java,認知有限):
從控制檯接收一個字元,然後將其打印出來
import java.io.*; public static void main(String [] args) throws IOException{ System.out.print("Enter a Char:"); char i = (char) System.in.read(); System.out.println("your char is :"+i); }
從控制檯接收一個字串,然後將其打印出來。 在這個題目中,我們需要用到BufferedReader類和InputStreamReader類
import java.io.*; public static void main(String [] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = null; System.out.println("Enter your value:"); str = br.readLine(); System.out.println("your value is :"+str); }
第三中方法,感覺最為方便適用性最大,就是用Scanner類
import java.util.Scanner; public static void main(String [] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入你的姓名:"); String name = sc.nextLine(); System.out.println("請輸入你的年齡:"); int age = sc.nextInt(); System.out.println("請輸入你的工資:"); float salary = sc.nextFloat(); System.out.println("你的資訊如下:"); System.out.println("姓名:"+name+"\n"+"年齡:"+age+"\n"+"工資:"+salary); }
next()和nextLine()的區別:
在java中,next()方法是不接收空格的,在接收到有效資料前,所有的空格或者tab鍵等輸入被忽略,若有有效資料,則遇到這些鍵退出。nextLine()可以接收空格或者tab鍵,其輸入應該以enter鍵結束。
在執行nextInit()函式之後,敲擊了enter回車鍵,回車符會被 nextLine()函式吸收,實際上是執行了nextLine()函式吸收了輸入的回車符(並不是沒有執行nextLine函式),前面講到和 nextLine()功能一樣的函式next(),他們的區別就在於:next()函式不會接收回車符和tab,或者空格鍵等,所以在使用 nextLine()函式的時候,要注意敲擊的回車符有個被其吸收,導致程式出現BUG