Java和C#中的接口对比(有你不知道的东西)

简介:

1.与Java不同,C#中的接口不能包含字段(Field)。

在java中,接口中可以包含字段,但是这些字段隐式地是staticfinal的。而C#不允许接口中有字段,编译器在编译时就会提示错误(如下代码所示)。
interface IInterface            
    {
        int a ;//编译器错误提示:接口不能包含字段
    }

2、在C#和Java中,接口内的所有方法默认都是公用方法。

在Java中,方法声明可以带有public修饰符(即使这并非必要),但在C#中,显式地为接口中的方法指定public修饰符是非法的。例如,下面的代码将产生一个编译错误。 
interface IInterface
    {
        public int add();//错误提示:修饰符“public”对该项无效
    }

3、C#中特有的实现接口和显式实现接口.

普通实现接口
复制代码
interface IInterface
    {
        int add(int a,int b) ;
    }
    class Program:IInterface
    {
        static void Main(string[] args)
        {
            Program ii = new Program();     //使用实体类来访问自己的接口函数
            Console.WriteLine(ii.add(1, 2));//正确运行,没有提示错误
        }

        public int add(int a, int b)
        {
            return a + b;
        }
    }
复制代码
 
显示地实现接口
复制代码
interface IInterface
    {
        int add(int a,int b) ;//编译器错误提示:接口不能包含字段
    }
    class Program:IInterface
    {
        static void Main(string[] args)
        {
            Program newProgram = new Program();
            newProgram.add(1, 2);//编译器提示错误:“ConsoleApplication3.Program”不包含“add”的定义,
                                 //并且找不到可接受类型为“ConsoleApplication3.Program”的第一个参数的扩展方法“add”(是否缺少 using 指令或程序集引用?)          
        }

        int IInterface.add(int a, int b)//显示实现接口,注意这个方法多了IIterface限定符
        {
            return a + b;
        }
    }
复制代码

另外,我们注意到显式实现接口后int IInterface.add(int a, int b)中少了public修饰符,但是我们一加上编译器又会提示错误:“修饰符“public”对该项无效”。另外因为是Program类访问自身的方法,所以访问性也不是构成add()方法无法访问的原因。

如果我们将main()函数中的代码修改一下,将new Program()的变量赋给IIterface的引用,再看看结果如何

static void Main(string[] args)
        {
            IInterface ii = new Program();
            Console.WriteLine(ii.add(1, 2));//正确运行,没有提示错误
        }

从以上结果,我们可以看出如果是显示实现接口,那么对接口中方法的访问必须要通过接口类型的引用,用显示实现了接口的类是没有办法使用的。

显式接口成员实现的两个主要用途

· 由于显式接口成员实现不能通过类或结构实例来访问,因此它们就不属于类或结构的自身的公共接口。当需在一个公用的类或结构中实现一些仅供内部使用(不允许外界访问)的接口时,这就特别有用。

· 显式接口成员实现可以消除因同时含有多个相同签名的接口成员所引起的多义性。如果没有显式接口成员实现,一个类或结构就不可能为具有相同签名和返回类型的接口成员分别提供相应的实现,也不可能为具有相同签名和不同返回类型的所有接口成员中的任何一个提供实现。


作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/p/3291730.html

目录
相关文章
|
1月前
|
Java
【Java】一个简单的接口例子(帮助理解接口+多态)
【Java】一个简单的接口例子(帮助理解接口+多态)
17 0
|
1月前
|
Java
JAVA接口
JAVA接口
12 0
|
19小时前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
6天前
|
Java 开发者
探索 Java 的函数式接口和 Lambda 表达式
【4月更文挑战第19天】Java 中的函数式接口和 Lambda 表达式提供了简洁、灵活的编程方式。函数式接口有且仅有一个抽象方法,用于与 Lambda(一种匿名函数语法)配合,简化代码并增强可读性。Lambda 表达式的优点在于其简洁性和灵活性,常用于事件处理、过滤和排序等场景。使用时注意兼容性和变量作用域,它们能提高代码效率和可维护性。
|
7天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
13 0
Java接口中可以定义哪些方法?
|
8天前
|
设计模式 Java
Java接口与抽象类
Java接口与抽象类
17 0
|
12天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
35 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
15天前
|
存储 Java
java接口和内部类
java接口和内部类
|
16天前
|
缓存 安全 Java
Java中函数式接口详解
Java 8引入函数式接口,支持函数式编程。这些接口有单一抽象方法,可与Lambda表达式结合,简化代码。常见函数式接口包括:`Function<T, R>`用于转换操作,`Predicate<T>`用于布尔判断,`Consumer<T>`用于消费输入,`Supplier<T>`用于无参生成结果。开发者也可自定义函数式接口。Lambda表达式使实现接口更简洁。注意异常处理和线程安全。函数式接口广泛应用于集合操作、并行编程和事件处理。提升代码可读性和效率,是现代Java开发的重要工具。
29 0
|
16天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
40 0