从C转到JAVA学习路之基本知识对比

         我一直在用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语言以后,学其它的语言都容易,这句是真的呵呵


到此为止,从C转到JAVA下所有的心理问题及本质问题我都搞懂了,后面就开始我的JAVA知识之旅了,类的三大特性,接口,设计模式等。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值