抽象类或接口

时间:2011-04-05 02:01:13

标签: java class interface abstract

public class C {
  public abstract Boolean methodC();
}

Class A implements C {
 // all non-abstract methods
}

Class B extends A {
// all non-abstract methods
}
  

在Java中,C可以是抽象类   还是必须是一个界面?   [注:它说 - '一个实施   C'。你能实现一个摘要吗?   Java中的类?]

8 个答案:

答案 0 :(得分:5)

以下是一些非常有用的术语说明:

接口:这是方法的集合。它们没有任何定义,它们的功能由实现它们的决定。接口的示例是List。所有列表(ArrayList,LinkedList)都有add()和remove()方法,因为它们实现了 List 接口,这需要它们。

public interface List {
    public void add (Object o);
    public void remove (Object o);
}

public class MyList implements List {

    public void add (Object o) {
       // I must implement this method because of the interface List
    }

    public void remove (Object o) {
       // I must implement this method because of the interface List
    }
}

抽象类:这是一个部分完成的类。它与接口的不同之处在于它通常包含一些功能。但是,它(通常)缺少一些需要由* extend * ing子类定义的方法。这些方法在抽象超类中定义为 abstract 方法。

public abstract class AbstractThing {

     public void method1 (Object o) {
         // This is a real method that does things
     }

     // Anyone who extends me must implement this
     public abstract void method2 (Object o1, Object o2);
}

public class ActualThing extends AbstractThing implements List {

    public void add (Object o) {
       // I must implement this method because of the interface List
    }

    public void remove (Object o) {
       // I must implement this method because of the interface List
    }

    public void method2 (Object o1, Object o2) {
       // I must implement this method because of abstract method in
       // the super class
    } 

类使用 implements 关键字来表示它将实现接口所需的方法。一个类可以实现任意数量的接口;唯一的要求是它为每个方法提供了一个定义。它也可以定义为 abstract ,并依赖其子类来定义一些。然后,这些方法就像任何其他抽象类的抽象方法一样。

类使用 extends 关键字来表示它将向某个现有类添加功能。如果父类是抽象的,则扩展类必须在父类中实现任何这些抽象方法。一个类只能扩展一个父类。

为什么这么复杂?接口很好,因为您可以假设实现类的某些功能。具体情况是List接口。大多数方法都不关心他们得到什么样的列表;他们只是想知道该对象支持公共列表方法。在声明中:

List<String> myList = new ArrayList();

您正在创建一个实际的ArrayList对象,但在List接口下隐藏它的实现。然后,如果您决定使用LinkedList,则不必更改所有代码,因为它也在实现List接口。

Java还定义了几个“接口集”(例如持久性),但没有实现。这允许第三方开发自己的实现(实际类),但由于它们都实现了相同的公共接口,开发人员可以在不更改代码的情况下交换实现。

答案 1 :(得分:3)

A类无法实现C,因为C不是接口。

让我们理解它, java中的接口是类的蓝图。它只有静态常量和抽象方法。

java中的接口是一种实现完全抽象的机制。 java接口中只能有抽象方法而不是方法体。它用于在Java中实现完全抽象和多重继承。

Java接口代表IS-A关系

它不能像抽象类一样实例化。

如下图所示,一个类扩展了另一个类,一个接口扩展了另一个接口,但类实现了一个接口

enter image description here

答案 2 :(得分:2)

A类无法实现C,因为C不是接口。你扩展课程;你实现接口。

C看起来可以是抽象类或接口,因为您没有该方法的默认行为。

答案 3 :(得分:1)

在Java中,每个类只能扩展另外一个类,但它可以实现任意数量的接口。

C可以是接口,也可以是抽象类。

答案 4 :(得分:1)

C可以是;如果它是一个类,它必须被声明为“公共抽象类。”

答案 5 :(得分:1)

如果C是一个抽象类,那么A应该扩展C.另外,在定义C时,你需要在单词class之前使用abstract这个词。

如果C是接口,则在methodC之前删除“abstract”一词。

答案 6 :(得分:1)

任何具有所有抽象方法的类型通常都是一个接口,但没有什么能阻止它成为一个抽象类。因此,您的示例中的C可以是一个类,就像您拥有它一样。更常见的是它是一个界面。

你的A类声明它实现了C.类只能实现接口。所以,如果你想让C保持一个类,那么A将需要扩展C.如果你使C成为一个接口,那么使用implements就是正确的。

答案 7 :(得分:1)

以下是规则摘要:

  1. 接口可以extend任意数量的接口。
  2. 一个类可以选择extend一个类;如果您没有指定任何内容,它会扩展Object
  3. 一个类可以implement任意数量的接口。
  4. 任何类都可以声明为abstract
  5. 任何具有抽象方法的类必须声明为abstract
  6. 任何扩展抽象类或实现接口的类都必须实现所有抽象和接口方法,否则必须声明abstract