原文:http://www.cprogramming.com/tutorial/java/syntax-differences-java-c++.html
首先,兩件大事-主函數(shù)和怎樣編譯,下面是它們的小差別:
主函數(shù)
C++
// 自由函數(shù)
int main( int argc, char* argv[])
{
printf( "Hello, world" );
}
Java
// 每個(gè)函數(shù)必須是類成員;當(dāng)java類運(yùn)行時(shí)類中的主函數(shù)就會(huì)被調(diào)用
//(所以你可以為每個(gè)類寫一個(gè)主函數(shù)--這樣用于給類寫單元測(cè)試時(shí)會(huì)很方便)
class HelloWorld
{
public static void main(String args[])
{
System.out.println( "Hello, World" );
}
}
編譯
C++
// 編譯
g++ foo.cc -o outfile
// 運(yùn)行
./outfile
Java
// 編譯在foo.java里的類成為<類名>.class
javac foo.java
// 調(diào)用<類名>中的靜態(tài)main函數(shù)
java <classname>
注釋
兩種語言完全相同 (// 和 /* */ 都能工作)
類聲明
大部分一樣,除了Java不要求后面有個(gè)分號(hào)
C++
class Bar {};
Java
class Bar {}
方法聲明
基本相同,除了Java中必須是類成員并且可能有public/private/protected前綴之外。
構(gòu)造和析構(gòu)
構(gòu)造語法相同,Java沒有析構(gòu)的等價(jià)物。
靜態(tài)成員函數(shù)和變量
方法聲明方式相同,不過Java提供了static initialization blocks來初始化靜態(tài)變量(代替在源碼文件中放定義):
class Foo
{
static private int x;
// static initialization block
{ x = 5; }
}
對(duì)象聲明
C++
// 棧對(duì)象
myClass x;
// 堆對(duì)象
myClass *x = new myClass;
Java
// 總是分配在堆上(而且,構(gòu)造總是要寫括號(hào))
myClass x = new myClass();
引用vs.指針
C++
// 引用是不可改的,使用指針能得到更大的彈性
int bar = 7, qux = 6;
int& foo = bar;
Java
// 引用是可改的,它僅存放對(duì)象的地址。沒有原生指針。
myClass x;
x.foo(); // 錯(cuò)誤,x是空“指針”
// 注意Java里總是使用 . 存取域
繼承
C++
class Foo : public Bar
{ ... };
Java
class Foo extends Bar
{ ... }
保護(hù)級(jí)別
C++
public:
void foo();
void bar();
Java
public void foo();
public void bar();
虛函數(shù)
C++
virtual int foo();
Java
// 函數(shù)默認(rèn)就是虛函數(shù);使用final防止被重載
int foo();
抽象類
C++
// 只要包含一個(gè)純虛函數(shù)
class Bar { public: virtual void foo() = 0; };
Java
// 可以用語法直接定義
abstract class Bar { public abstract void foo(); }
// 或者指定為接口
interface Bar { public void foo(); }
// 然后,用一個(gè)類實(shí)現(xiàn)implement它:
class Chocolate implements Bar
{
public void foo() { /* do something */ }
}
內(nèi)存管理
大致相同--new 分配, 不過因?yàn)?span lang="EN-US">Java著名的垃圾回收機(jī)制所以沒有delete。
NULL vs. null
C++
// 初始化指針為NULL
int *x = NULL;
Java
// 使用未初始化的引用會(huì)被計(jì)算機(jī)捕獲,不過可以賦值為null指明引用為無效。
myClass x = null;
布爾值
Java要長(zhǎng)一點(diǎn),你得寫boolean來代替簡(jiǎn)短的bool。
C++
bool foo;
Java
boolean foo;
常量
C++
const int x = 7;
Java
final int x = 7;
Throw說明
首先, Java在編譯時(shí)強(qiáng)制要求有throw說明-如果一個(gè)方法要拋出一個(gè)異常你必須先說明它
C++
int foo() throw (IOException)
Java
int foo() throws IOException
數(shù)組
C++
int x[10];
// 或者
int *x = new x[10];
// 使用x然后收回內(nèi)存
delete[] x;
Java
int[] x = new int[10];
// 使用x,內(nèi)存由垃圾回收機(jī)制回收
集合和迭代
C++
迭代器是類成員,一個(gè)范圍起始于<container>.begin(), 終止于<container>.end(). 使用++操作前進(jìn),使用*存取。
vector myVec;
for ( vector<int>::iterator itr = myVec.begin();
itr != myVec.end();
++itr )
{
cout << *itr;
}
Java
迭代器僅僅是一個(gè)接口。一個(gè)范圍起始于<collection>.iterator, 接著使用itr.hasNext()檢查確認(rèn)是否已到末尾。使用itr.next()取得下一個(gè)數(shù)據(jù)。
ArrayList myArrayList = new ArrayList();
Iterator itr = myArrayList.iterator();
while ( itr.hasNext() )
{
System.out.println( itr.next() );
}
// 在Java 5中:
ArrayList myArrayList = new ArrayList();
for( Object o : myArrayList ) {
System.out.println( o );
}