zoukankan      html  css  js  c++  java
  • [和管子对话] 2 200746/抽象类和接口的谁是谁非

    发布日期:2007.4.6 作者:Anytao

    ©2007 Anytao.com 转贴请注明出处,留此信息。

     

    本文将介绍以下内容:

    • .NET的基础和技巧探讨

    • 胡言乱语话技术

    王论:

    今日话题:《抽象类和接口的异同》

    管语:

    呵呵!好!

    先说一下抽象类:
    抽象类是声明方法的存在而不去实现它,这样的类就是抽象类,它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现方法,这和接口一致。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。取而代之,在子类中实现该方法。就是说知道其行为的子类或其他类可以在类中实现这些方法。
    在java中,抽象类中可以没有抽象方法
    如果一个类中有抽象方法,那么这个类必须定义为抽象类

    王论:

    我来说接口:
    接口在某种程度上和抽象类是一样的,例如都是提供了声明而没有实现,必须由集成的类实现所有定义的接口方法,否则不能编译。
    上述你所说的关于Java中抽象类的规则,基本和.NET差不多。

    管语:

    java中:
    接口是抽象类的变体。在接口中,所有方法隐含着都是抽象的。多继承性可通过实现这样的接口而获得。因为接口中的所有方法都是抽象的,所以没有一个有程序体。接口可以定义static final成员变量,我认为这是一个抽象类不同的地方,接口的实现与子类相似,但是这个实现类不能从接口定义中继承行为。这也是和普通类继承机制不同的地方。当类实现特殊接口时,它定义必须所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。instanceof 运算符可以用来决定某对象的类是否实现了接口。

    抽象类中,究竟可不可以实现一个方法?我刚才是不是说错了?

    王论:

    刚才讲了相同点,现在说说不同处:
    抽象类:可以包括抽象方法,也可以提供非抽象方法,也就是说,抽象类中可以有实现的方法,这些方法可以提供公共的规则定义。
    接口:只能提供没有实现的抽象方法,在接口中,所有的方法都默认为public,因此,接口中不能有private修饰符。
    抽象类:只能单继承;
    接口:可以多继承。

    管语:

    其实就是应该多说说他们的不同点

    王论:

    是啊,另外你刚才说的instanceof操作符号,是用来判断接口类型,还是其他类型都可以判断:
    在C#中有一个is操作符是可以判断所有类型的。例如:

     1interface IAnytao
     2{} 
     3
     4class Test
     5{
     6IAnytao tao = new Anytao();
     7if (tao is IAnytao) 
     8{
     9Console.Write("tao is a instance of IAnytao.");
    10}

    11}

    12

     

    管语:

    intanceof和is是一个意思!

    王论:

    另外,C#中还有as操作符,Java中有对应的吗?

    管语:

    as是干吗的?

    王论:

    和is差不多,不过更常用,效率更高

    管语:

    区别:

    1、接口可以被多重implements,抽象类只能被单一extends

    2、接口只有定义,抽象类可以有定义和实现

    3、接口的字段定义默认为:public static final,抽象类字段默认是友元的,就是“friend”(本包可见)

    4、抽象类是一个不完整的类,需要进一步细化,而接口是一个行为的规范。

    5、接口基本不具备继承的任何基本特点,它只是承诺了能够调用的方法。

    6、一个类一次可以实现多个接口,但是只能继承一个父类。

    7、接口可以用于支持回调(callback),但是继承不行。用于回调的接口只是提供指向方法的指针,而且是一个类型安全的“指针方式”。

    ©2007 Anytao.com 转贴请注明出处,留此信息。

    本贴子以现状提供且没有任何担保,同时也没有授予任何权利。
    This posting is provided "AS IS" with no warranties, and confers no rights.

  • 相关阅读:
    leetcode 131. Palindrome Partitioning
    leetcode 526. Beautiful Arrangement
    poj 1852 Ants
    leetcode 1219. Path with Maximum Gold
    leetcode 66. Plus One
    leetcode 43. Multiply Strings
    pytorch中torch.narrow()函数
    pytorch中的torch.repeat()函数与numpy.tile()
    leetcode 1051. Height Checker
    leetcode 561. Array Partition I
  • 原文地址:https://www.cnblogs.com/anytao/p/703061.html
Copyright © 2011-2022 走看看