C++与Java的区别及联系有以下几点:

1、  C++和Java在语法上非常相似。

2、  Java关注的是安全性,可移植性和快速开发;C++则更多关注性能以及与C向下兼容。

3、  Java被编译成虚拟机字节码,需要由虚拟机运行;C++则被编译成本地机器码。这点使C++运行更快。

4、  C++是C的超集,保留了许多功能,如内存管理、指针和预处理,这是为了和C保持完全兼容。Java去除了这些功能,它用垃圾收集代替了程序员释放内存;它还放弃了运算符重载和多重继承等C++的功能;但它可以利用接口实现有限制的多重继承。

5、  Java中所有对象都是按引用传递的;C++中,缺省行为是按值传递的。

6、  Java中所有的方法都是虚方法,默认都是虚函数;而C++中必须显示地声明为virtual。

7、  Java对基本数据类型有规定的字节大小;C++中类型的字节大小取决于C++(和C)的实现。

8、  当存在遗留的C代码或对性能有较大需求时,选择C++,特别是在需要访问底层系统时;当强调可移植性、安全性和开发速度时,应选择Java。

 

主要语法区别:

 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别。

main 函数
C++

//自由浮动的函数
 int main( int argc, char* argv[])
 {
     printf( "Hello, world" );
 }


Java

// 每个函数都必须是一个类的一部分;当java<class>运行是一个特定类的主函数会被调用
 // (因此你可以让每个类都有一个main函数,这在写单元测试是很有用)
 class HelloWorld
 {
     public static void main(String args[])
     {
         System.out.println( "Hello,World" );
     }
 }

类的声明

除了 Java 不要求用分号外几乎是相同的。 
C++
    class Bar {};
    
Java
    class Bar {}
   

方法声明
   都相同的, 除了在Java,方法必须总是某个类的一部分并且可能public/private/protected 作为修饰

构造函数和析构函数构造函数都是相同的 (即类的名字), Java没有准确意义上的的析构函数

静态成员函数和变量
方法声明是相同的, 但 Java提供静态初始化块来来初始化静态变量 (不需要在源文件中声明): 

class Foo 
 {
     static private int x;
     // 静态初始化块
     { x = 5; }
 }

对象的声明
C++

// 在栈中
     myClass x;
  
     //或者在堆中
     myClass *x = new myClass;

    
Java   // 总是在对堆中声明

myClass x = new myClass();


   

继   承

C++    class Foo : public Bar
    { ... };
    
Java    class Foo extends Bar
    { ... }
    

访问级别 (abstraction barriers)
C++

public:
         void foo();
         void bar();


    
Java    public void foo();

public void bar();


    

虚函数
C++

    virtual int foo(); // 或者非虚函数写作 int foo();
    
Java

// 函数默认的就是虚函数; 用final关键字防止重载
     int foo(); // 或者, final int foo();

内存管理

大体上是相同的--new 来分配, 但是 Java没有 delete,因为它有垃圾回收器。

NULL vs null
C++

    // 初始化一个指针为 NULL
    int *x = NULL;
    
Java

// 编译器将捕获使用未初始化的引用
    //但是如果你因需要初始化一个引用而赋一个null,那么这是无效的
     myClass x = null;


    

布尔型
Java有一点罗嗦: 你必须写boolean而不止是 bool. 
C++
   bool foo;
Java

     boolean foo;

常   量
C++

    const int x = 7;
    
Java
    final int x = 7;
    

抛异常
首先,Java在编译器强制抛异常—如果你的方法可能会抛异常你必需明确报告 
C++

int foo() throw (IOException)


Java

int foo() throws IOException

数     组
C++

int x[10];
     // 或
     int *x = new x[10];
     // 使用 x,然后归还内存
     delete[] x;


    
Java    int[] x = new int[10];
    // 使用 x, 内存有垃圾回收器回收或
    //或在程序生命周期尽头归还给系统
    

集合和迭代器
C++

迭代器是类的成员。范围的开始是<容器>.begin(), 结束是 <容器>.end()。 用++ 操作符递增,  用 *操作符访。 

vector myVec;
     for ( vector<int>::iterator itr = myVec.begin();
           itr != myVec.end();
           ++itr )
     {
         cout << *itr;
     }


    
Java
迭代器只是一个接口。 范围的开始是 <集合>.iterator,你必须用itr.hasNext()来查看是否到达集合尾。 使用itr.next()(是在C++中使用操作符++ 和*操作的结合)来获得下一个元素。 

ArrayList myArrayList = new ArrayList();
     Iterator itr = myArrayList.iterator();
     while ( itr.hasNext() )
     {
         System.out.println( itr.next() );
     }
  
     // 或, 在Java5中
     ArrayList myArrayList = new ArrayList();
     for( Object o : myArrayList ) {
         System.out.println( o );
     }


        

抽象类
C++
    // 只需要包含一个纯虚函数

class Bar { public: virtual void foo() = 0; };


    
Java

// 语法上允许显示的声明!
     abstract class Bar { public abstract void foo(); }
  
     // 或者你也可以声明一个接口
     interface Bar { public void foo(); }
  
     // 然后让一个类继承这个接口:
     class Chocolate implements Bar
     {
         public void foo() { /* do something*/ }
     }


    
引用 vs  指针
C++

//引用不可改变,通过使用指针来获得更多的灵活性
     int bar = 7, qux = 6;
     int& foo = bar;


    
Java

// 引用是可变的,仅存储对象地址; 
     //没有指针类型
     myClass x;
     x.foo(); // error, x is a null ``pointer''
  
     // 注意你要总是用 . 来访问域


    
编  译

C++
     // 编译
     g++ foo.cc -o outfile
     // 运行
     ./outfile
     
 Java
    // 编译foo.java文件中的类成<classname>.class   javac foo.java 
     // 通过调用<classname>中的静态main方法来运行
     java <classname>


    
注   释
两种语言是一样的 (//和 /* */ 可以用)