Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.13)

本文介绍如何在Java中通过接口实现类似C语言中的函数指针功能,以支持回调机制。通过具体实例展示了如何利用自定义接口实现排序算法中的升序和降序操作。

4.1.13如何实现类似于C语言中的函数指针的功能

在C语言中,有一个非常重要的概念——函数指针,最重要的功能是实现回调函数。所谓毁掉函数就是函数现在某处注册,而它将在稍后某个需要的时候被调用。在Windows系统中,开发人员想让系统动态链接库(DLL)调用自己编写的一个方法,于是利用DLL当中回调函数的接口来编写程序,通过传递一个函数的指针来被调用,这个过程称为回调。回调函数一般用于截获消息、获取系统信息或处理异步事件。
函数指针一般作为函数的参数来使用,开发人员在使用时可以根据自己的需求传递自定义的函数来实现指定的功能,例如,在实现排序算法时,可以通过传递一个函数指针来决定两个数的先后顺序,从而最终决定该算法是升序还是降序。
在Java中没有显示的定义指针的用法,我们可以利用接口与类来实现同样的效果。具体而言,应该先定义一个接口,然后在接口中声明要用的方法,接着实现这个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数的功能。
代码如下:

interface IntCompare{

    public int com(int a,int b);
}

class Comp1 implements IntCompare{
    public int com(int a,int b){
        if(a > b)
            return 1;
        else if(a < b)
            return -1;
        else
            return 0;

    }
}

class Comp2 implements IntCompare{

    public int com(int a,int b){
        if(a < b)
            return 1;
        else if(a > b)
            return -1;
        else
            return 0;
    }
}
public class FunctionPoint {

    public static void insertSort(int[] a,IntCompare cmp){

        if(a != null)
        {
            for(int i=1;i<a.length;i++)
            {
                int temp = a[i];
                int j=i;
                if(cmp.com(a[j-1], temp) == 1)
                {
                    while(j >= 1 && cmp.com(a[j-1], temp) == 1)
                    {
                        a[j] = a[j-1];
                        j--;
                    }

                }
                a[j] = temp;
            }

        }
    }

    public static void main(String[] args){

        int array1[] = {7,3,19,40,4,7,1};
        insertSort(array1,new Comp1());
        System.out.println("升序排列:");
        for(int i=0;i < array1.length;i++)
        {
            //int array4[] = {1,2,3};
            System.out.print(array1[i]+" ");

        }
        System.out.println();


        /*
         * 这里两次for循环都声明了int i,java程序不会报错,原因如下
         *因为for循环相当于代码段,是独立的一个块。但是它比较特殊,
         *不同于函数的是,对于函数中定义的变量,有他的作用范围;
         *而位于for语句之前定义的变量或属性将会被for语句识别,并可以直接使用;
         *而位于for语句之后的定义则会被for代码块遗忘,
         *相当于for循环运行完成后,会将for循环中定义的的所有变量释放,程序告一段落。for循环之后的程序块将另起炉灶。 
         *例如程序中对arry4[]的定义及打印,这样是不会出错的,打印信息为:1 *2 *3 *4 * 
         */

        /*int array4[] = {1,2,3,4};
        for(int i=0;i<array4.length;i++)
        {
            System.out.print(array4[i]+" *");
        }*/
        System.out.println();
        int array2[] = {7,3,19,40,4,7,1};
        insertSort(array2, new Comp2());
        System.out.println("降序排列:");
        for(int i=0;i<array2.length;i++)
        {
            System.out.print(array2[i]+" ");
        }
        System.out.println();
    }

}

运行结果:
升序排列:
1 3 4 7 7 19 40

降序排列:
40 19 7 7 4 3 1

上例定义了一个用来比较大小的接口IntCompare,这个接口实际上充当了C语言中函数指针的功能,在使用中,开发人员可以根据实际需求传入自定义的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值