從C轉到JAVA學習路之基本知識對比(轉)


轉自:http://blog.csdn.net/andywxf01/article/details/53502615

我一直在用C開發,想轉到Java時最容易想到的事就是把C里寫的代碼和功能用JAVA寫出來,這樣接受起來會容易多了。只要心理不排斥,后面的事不都是分分鍾鍾的事嘛,(沒時間的重點看第二部分)。

一: C與JAVA相同的地方

我嘗試着寫了下面的C代碼,都是簡單的代碼。

#include<stdio.h>
void score_level(char level)
{
    switch(level)
    {
    case 'A':
        printf("90-100\n");
        break;
    case 'D':
        printf("<60\n");
        break;
    }
}
void sort(int arr[]) //數組排序
{
    int i, j, tmp;

    for(i=0; i<10; i++)
        for(j=0; j<10-i-1; j++)
    {
        if(arr[j]>arr[j+1])
        {
            tmp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = tmp;
        }
    }
}
int max(int a, int b)//求最大值
{
    return a>b?a:b;
}
int Fac(int n) //遞歸求階乘
{
    if(n==1 || n==0)
        return 1;
    else
        return Fac(n-1)*n;
}
void main()
{
     int i, mx, sum, array[10]={9,1,3,2,4,5,8,7,6,0};
     mx = max(5,10);
     sum = Fac(5);
     printf("%d %d\n", mx, sum);
     score_level('A');
     sort(array);
     for(i=0; i<10; i++)
        printf("%d ", array[i]);
}

結果運行如下:

10 120
90-100
0 1 2 3 4 5 6 7 8 9

之所以寫出上面的代碼基本上是把C常用的知識都包含了:函數的調用,參數傳值傳地址都有,遞歸,數組等(結構體不用說,類就是從結構體上來的)。
之后我把它直接轉到JAVA如下代碼:

public class Example {
    static void score_level(char level) 
    {
        switch(level)
        {
        case 'A':
            System.out.println("90-100");
            break;
        case 'D':
            System.out.println("<60");
            break;
        }
    }
    static void sort(int arr[]) //數組排序
    {
        int i, j, tmp;

        for(i=0; i<10; i++)
            for(j=0; j<10-i-1; j++)
        {
            if(arr[j]>arr[j+1])
            {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
    static int max(int a, int b)//求最大值
    {
        return a>b?a:b;
    }
    static int Fac(int n) //遞歸求階乘
    {
        if(n==1 || n==0)
            return 1;
        else
            return Fac(n-1)*n;
    }

    public static void main(String[] args) {
        
          int i, mx, sum;
          int array[]={9,1,3,2,4,5,8,7,6,0};
             mx = max(5,10);
             sum = Fac(5);
             System.out.println(mx+" "+sum);
             score_level('A');
             sort(array);
             for(i=0; i<10; i++)
                 System.out.print(array[i]+" ");
    }
}

運行結果跟C一模一樣的。到這里哥心里嗨了,這樣才對嘛,讓我感覺JAVA強大之前,先讓我能寫出我之前的代碼我才能接受啊。


二: 上面知識中JAVA更強大的地方

       1) 方法的重截:

       C語言中的函數的唯一性是通過函數名來區別的,函數不能同名,如果想寫求比較int型和double型的最大值函數要用兩個不同名的如下:

    double max_double(double a, double b)//求最大值
    {
        return a>b?a:b;
    }
    int max_int(int a, int b)//求最大值
    {
        return a>b?a:b;
    }

而這樣在JAVA中可以同名寫出如下的代碼:

    static double max(double a, double b)//求最大值
    {
        return a>b?a:b;
    }
    static int max(int a, int b)//求最大值
    {
        return a>b?a:b;
    }

大家對比下可能會發現沒多大區別啊,不還都是兩個函數嗎? 寫的時候是沒多大區別,但調用區別就大了。

    在C語言中max_double(1.3, 1.5) 用來比較double, max_int(3,5)用來比較int。但實際上我要的就是比較兩個數的大小嘛,直接用一個函數不就行了,為什么還要區分呢。

    在JAVA里就不用區分了,直接用max(1.3, 1.5), max(3, 5)多人性。

      有的人覺得沒什么了不起嘛,不都是編寫了兩個函數。但JAVA的使用更高一個層次,這也是JAVA比C高級的地方,用JAVA開發的效率更高更好使用更符合現實世界。(但JAVA代碼執行效率比C差,誰要跟我撕B這一點,我弄死他)。
      那么JAVA是如何做到的呢,其實也很簡單,C以前是通過函數名來唯一區別的,現在JAVA是用函數名+參數來區別的。 在使用max(1.3, 1.5)參數是浮點數,所以會自己調用max(double a, double b), 如果是max(3,5)參數是整數,所以就調用max(int a, int b);

    知道了上面的原理,所以可以分分鍾寫出讓JAVA蒙B的代碼,如下:

    static double max(double a, int b)//求最大值
    {
        return a>b?a:b;
    }
    static double max(int a, double b)//求最大值
    {
        return a>b?a:b;
    }

調用mx = max(5,10); 立馬編譯錯誤,JAVA不知道該調用哪個max了。

    2) 傳值與引用:

        C語言里最強大也最讓人郁悶的是--指針(這個答案是唯一的)。函數調用到底是傳值還是傳指針的,傻傻分不清楚,其實C參數傳遞就一種:形參與實參之間是簡單的值拷貝,就這樣簡單。只是說指針之間的拷貝后,兩個針指都可以操作能一塊內存數據了。

        如果兩個人都能操作同一個東西,是不是可以說這兩個人引用的是同一個東西呢?現實就是這樣的。所以JAVA里叫引用,JAVA里是不是所有的都是引用呢,不是的JAVA跟C一樣一樣的,也是值拷貝。不過JAVA聰明點在於:除了基本類型(int , char double等),其它的所有類默認都是傳指針。

        請看如下代碼:

public class Example {

    static void change(int a)
    {
        a = 10;
    }

    public static void main(String[] args) {
        int a=5;
        change(a);
        System.out.println(a);
    }
}

執行結果很明顯是5,change函數並沒有取到改變的效果,因為就是簡單的值拷貝。

   用個類來試下:

public class Example {
    static class Data {
        int a;
    }
    static void change(Data dt)
    {
        dt.a = 10;
    }

    public static void main(String[] args) {
        Data dt = new Data();
        dt.a = 5;
        change(dt);
        System.out.println(dt.a);
    }
}

這個執行結果是10, change改變取到了效果。原理就是所有類之間的傳遞是通過指針傳遞,共用通一個東西,而JAVA把它寫的非常簡單,不需要用&和*來操作。

 到這里整個世界都清晰了,更加證明了JAVA是從C上來的。

總結一下:

   1) C下的知識都可以轉到JAVA下,搞C的人沒必要在糾結了,快快轉吧。

   2) JAVA里所有的類之間的傳遞都是指針地址,除了最基本的(int , double等類型)(本質跟C是一樣的)。

   3) 傳說學好C語言以后,學其它的語言都容易,這句是真的呵呵

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM