Java 与 C++ 的缠绵瓜葛(语言对比)

发表于 2016-08-29 15:36 显示全部楼层 27 2329

本帖最后由 雪后初晴 于 2016-8-31 10:33 编辑

“不论走了多远的路,请别忘记在某个恰当的时间点,

悉心打理自己一路风雨留下的足迹。”——致成长中的自己


写在正文之前:

依个人对IT领域的体会而言,

从长远的发展眼光看,要想为一名优秀的程序猿,

最好能将Java,与C++一同学会。

对于C++党来说,C++在编码效率、代码健壮性实在不如Java。

而对于Java党来说,

一旦走向底层代码,若不会C/C++可谓捉襟见肘。

例如,Andriod开发中用到的NDK,JNI等必须有C/C++,Linux的基础。

由此可见,

成为一名优秀的程序猿着实不易,要求的不仅仅是某一方面的知识,

而是集各家之所长,综合运用。


话不多说,下面进入正题咯。。。

(注:个人观点,仅供参考。另外个人水平也有限,

 总结的不妥之处,还望学友们不吝指正。)


一.年代PK

1971年左右,诞生C语言

1983年左右,诞生C++语言

1995年左右,诞生Java语言


二.语言排位榜PK

在历史的图案上,

Java和C语言总是不相伯仲,

于不同的时期,你争我夺第一名的位置。

早些年C语言一直是No.1,使用率远超其他语言。

由于近些年互联网的昌盛兴起,

让Java超越了C语言成为了世界第一语言霸主。

C语言下降为第二的位置。


C++语言是万年老三。好像古龙小说里的那位:

人见人爱,花开花开,外号小李飞刀,排名天下第三

的李寻欢。


近10年,语言排位榜总是:

 Java,C,C++位列1,2,3名,无可撼动。

 真可谓:棋逢对手,三国争霸!


三.性能PK

结合现实需求,现代的编程语言需要切合以下四个要素:

efficiency , flexibility , abstraction , productivity.

即是:

效率、灵活、抽象、生产力。


且看前辈们为我们总结的,各大语言能力对比表格:

             运行效率      灵活      抽象        生产力(开发效率等)

C                 √          √  

C++            √          √          √    

Java,C#                                √            √


四.市场需求,编程能力需求、入门难度PK:

 市场需求:Java >> C++

 编程能力:C++ > Java

 入门难度:C++ > Java


五.编程风格异同。

 相同点:

    1.都是高级语言,

    2.都起源于面向对线的特性。

    3.是面向对象语言的家族成员。

 不同点:

    C++兼有面向过程以及其他的特性,

    Java主要是适于网络的特性。

     

六.语法格式。

 1.数据类型对比

 C++的数据类型

 (1).基本类型:

 整数型:short/int/long/long long

 字符型:char

 浮点型:float/double/long double

 布尔型:bool

 空类型:void

 (2).非基本类型

 array type

 enum type

 union type

 struct type

 class type(include string type)

 pointer type

 function type


 Java的数据类型:

 (1).基本类型:

 整数型:byte/short/int/long

 字符型:char

 浮点型:float/double

 布尔型:boolean


 (2).非基本类型

 class type(include string type)

 array type

 interface type

 enum type

 function type


 共有的复杂数据类型:

 顺序表、链表、栈、队列、广义表、树、图...

 

 新类型扩充:

 函数类型和枚举类型,是Java7,8新增加的新特性。

 

 主要区别在于:C++里多了指针类型,共用体类型。


 2.流程结构对比

 都遵循一定的程序执行流程。具体指的是:

 顺序,选择,循环结构。

 顺序:即从上到下按顺序执行语句

 选择:

 (1).if ... elseif ...else

 (2).switch...case ... default;

 都使用break控制switch;

 循环:

 while/do...while/for

 都使用break/continue;控制循环


 3.程序主要架构对比

 3.1 C++的程序主要架构:

 #include <XXX>/"YYY"

 [#include ...]

 global area;

    global variable declaration;

    global function declaration;


 class area:

   

  class ClassName [: public/protected/private SuperClass]

  {

   public/protected/priavte://this are modifiers.

   Constructor();

   ~Destructor();

   Member variable declaration;

   Menber function declaration;

   

  

  };


 

 3.2 Java的程序主要架构

 import java.XXX.YYY;

 [import ...]

 Modifier class className [extends SuperClass]

 {

   Constructor();

   Modifier member variable declaration;

   Modifier menber function declaration;

 }


 eg:C++:

 #include<iostream>

 using namespace std;


 //global variable declaration

 double X = 6.0f;

 double Y = 8.0f;


 //global function declaration

 void set(Point& point,double X,double Y)

 {

    point.x = X;

    point.y = Y;

 }

 

 class Point

 {

 public:

   //constructor

   Point(double X=0,double Y=0)

    :x(X),y(Y)

    {    }

  

   //modifier member function declaration 

   void printInfo()

   {

      cout<<"(x.y) = "<<"("<<x<<","<<"y"<<")"<<endl;

   }


private:

   //Modifier member variable declaration

   double X = 0;

   double Y = 0; 


 } 

 //global function declaration

 int main()

 {

   //定义类对象,调用输出函数。大家应该都懂,这儿省略。

   ...

   ...

   return 0;

  }


 Java:

 public class MainClass

 {

   public static void main(String[] args) 

   {

    //定义类对象,调用输出函数。大家应该都懂,这儿省略。

     ...

     ...

   }

  }


 public class Point

 {

   public Point(){    }

   public Point(double X,double Y)

   {



    }

   

   public void printInfo()

   {

      cout<<"(x.y) = "<<"("<<x<<","<<"y"<<")"<<endl;

   }


   public void set(double X,double Y)

   {

    this.x = X;

     this.y = Y;

   }


    private double x;

    private double y;

 }

 

 4.数组类型的对比

 4.0 无论是哪门语言,数组与类都不是同一种类型

 4.1 C/C++中,数组不是用类封装。

    在Java中,用类封装了数组。

 4.2 C/C++中,数组可存在不同存储区域;

    在Java中,数组一定存在堆内存区。

 

 从以上特性就可以得到以下不同:

 C/C++

 type arr[arraySize] = {...};

 C:

 type *parr = (type*)malloc(sizeof(type)*arraySize);

 C++:

 type* parr = new type[arraySize]{... ... };

 Java:

 basicType[] arr = {v1,v2,v3...};

 compoundType[] arr = {new coumpoundType(XXX),

            new coumpoundType(YYY),

            new coumpoundType(ZZZ),

            ...};

 or 

 compoundType[] arr = new compoundType[arraySize];

     arr[0] = new compoundType(XXX);

     arr[1] = new compoundType(YYY);

      arr[2] = new compoundType(ZZZ);


 在C/C++中,堆内存的变量需要手动释放,

 而Java中不需要,由JVM负责管理回收。

 C:

 free(parr);

 C++:

 delete parr;

 delete[] parr;

 Java:

 由系统隐式自动调用,

 protected void finalize() throws Throwable


 5.字符串类型的对比:

 C/C++:使用字符数组、字符串常量、字符串类、

      元素类型为字符串的模版类、QString类

      来存储、操作字符串。

 Java: 使用字符串类存储、操作字符串,

     例如:String类,StringBuilder类。


 6.类中的构造器对比

 相同点:

 1.都使用this来区分传入参数和类成员变量同名的问题。

 即:

 Java:

 class Example

 {

  public Example(string name ,int age)

  {

    this.name = name;

    this.age = age;

  }

  string name;

  int age;

 }


 C++:

 class Example
 {  

  public:

  Example(string name ,int age)

  {

    this->name = name;

    this->age = age;

  }

  string name;

  int age;

 }



 2.都支持构造器重载

 构造器重载:

 Constructor(param1);

 Constructor(param2);

 Constructor(param3);

 (param1 ≠ param2 ≠ ... paramN);(N>=0)


 不同点:

 1.C++的构造器区分初始化和赋值,而Java将二者一同处理。

 C++:

 class Example

 {

 public:

  Example(string name,int age)

     :name(name),age(age)

 {    }

 //at Java,this are error.

 private:

 string name;

 int age;

 

 }

 2.C++支持含有默认参数的构造器,而Java不支持。 

 默认参数类型:

 Constructor(param = XXX);

 C++:

 class Example

 {

 public:

  Example(string name=0,int age=0)

 { 

   this->name = name;

   this->age = age;   

 }

 //at Java,this are error.

 private:

 string name;

 int age;


 }


 


 7.类的成员方法的传参对比。

 二者一致,分为值传递和引用传递。

 例如:

 值传递:

 Java:

 public static int resove(int val);

 C++:

 public:

 static int resove(int val);

 

 引用传递:

 Java:

 public static int[] resove(int []arr);

 C++

 public:

 static int* resove(int *arr,int length);//√

 static int* resove(int arr[],int length);//√

 static int[] resvoe(int *arr,int length);//×

 static int[] resove(int arr[],int length);//×


 注意:1.Java在方法中是不会改变地址值的,

 在C++中十分可能改变地址值。



 8.变量与引用的赋值对比

 Java与C++相同,

 对于基本变量之间,不会相互影响;

 对于变量引用之间,一定会相互影响。

 eg:

 Java/c++:

 基本变量:

 int a = 66;

 int b = a;

 b= 77;

 //此时a依然是66;


 变量引用:

 C++:

 string a = "hello world";

 string b = a;

 b[1] = 'x';

 cout<<"string a = "<<a<<endl;

 //此时的a改变了,变为:hxllo world


 Java:

 Java.lang.StringBuilder a = "hello world";

 Java.lang.StringBuilder b = a;

 b.setCharAt(1,'x');

 System.out.println("StringBuilder a = "+a);

 //此时的a改变了,变为:hxllo world(同上)

 

 

 

 


 9.类的权限修饰符对比

 Java中的权限修饰符有四种,他们分别是:

 private,默认,protected,public

 

类型private默认protectedpublic
同一类
同一包中的子类×
同一包中的非子类×
不同包中的子类××
不同包中的非子类×××

 

   C++中的权限修饰符有三种,他们分别是:

  private,protected,public

 

类型privateprotectedpublic
本类
继承链上的类×
其他类或全局××

   

  由此可见,C++比Java少了一个默认的权限修饰符。

  

  10.存储类型修饰符,数据保护对比


  11.继承与派生对比


  12.多态对比


  13.图形用户界面对比(GUI)


  14.IO流/文件读写流对比


  15.JDBC操作对比


  16.线程对比


  17.C++11与Java5,6,7,8新特性对比

      17.1 泛型

      17.2 Lambda表达式

      17.3 函数式接口(Java)/函数式对象(C++)


  18... (待补充的其他,改日再写。)




回复 使用道具
举报
中华高露洁

发表于 2017-02-11 21:14 显示全部楼层

回复 支持 反对 使用道具
举报
我很认真的说

发表于 2017-02-11 21:11 显示全部楼层

回复 支持 反对 使用道具
举报
旧霾街

发表于 2017-02-11 21:11 显示全部楼层

回复 支持 反对 使用道具
举报
山秀

发表于 2017-02-11 21:10 显示全部楼层

为了学币每天必水一下,望见谅

回复 支持 反对 使用道具
举报
我不是悟空

发表于 2017-02-11 19:04 显示全部楼层

回复 支持 反对 使用道具
举报
龙天哥

发表于 2017-02-11 19:02 显示全部楼层

别人说是金子总要发光的,我就来看看。

回复 支持 反对 使用道具
举报
PPAP

发表于 2017-02-11 10:20 显示全部楼层

别人说是金子总要发光的,我就来看看。

回复 支持 反对 使用道具
举报
宁静致远

发表于 2017-02-11 10:17 显示全部楼层

回复 支持 反对 使用道具
举报
破葫芦

发表于 2017-02-11 10:17 显示全部楼层

围观楼主

回复 支持 反对 使用道具
举报
123下一页

发表新文章

5

学分

2273

学币

3318

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3318

叩丁狼版主勋章前100注册用户勋章叩丁狼一周年勋章活动达人勋章真土豪勋章勋章意见领袖勋章论坛百帖达成勋章

Ta的主页 发消息
精华帖排行榜

精彩推荐

  • 关注叩丁狼教育