关于java中抽象类和接口的几个问题?

时间:2011-09-01 15:39:08

标签: java

  1. 实现接口的抽象类的用途是什么?其中 我们会实施的方案。
  2. 为什么要在界面上选择抽象类?如果是一个班级 扩展一个Abstract类,我们应该实现所有的方法 抽象类。如果一个类应该实现一个接口 实现所有方法。
  3. 为什么要引入抽象类或接口模式?是什么 使用它们?它是否以对象的方式处理任何事情 实例化或行为方式?
  4. 如果抽象类声明了静态方法,那么我们可以吗? 实例化那个类?
  5. 我被问到这些问题,虽然我的答案不明确......我想知道这里的人吗?

4 个答案:

答案 0 :(得分:2)

1& 2)您可以将接口和抽象类一起使用 - 接口可以提供行为定义,抽象类提供部分实现,子类提供完整的实现。

3)接口和抽象类是 concepts 。 java语言设计者决定提供语言功能来实现这些概念。

4)永远不能实例化抽象类的实例。可以正常调用抽象类上的静态方法,记住通过引用类而不是类的实例来调用静态方法。

一些伪代码

abstract class Base {
   abstract void doSomething(); // subclass provides implementation

   protected helper() {
       // doSomething implementation in subclass can use helper
   }
}

答案 1 :(得分:1)

  

实现接口的抽象类的用途是什么?我们将在哪种情况下实施?。

一个重要用途是提供骨架实现,减少实现接口所需的工作量。这方面的一个例子是AbstractCollection<E>,它实现了Java Collections Framework中的Collection<E>接口。

  

为什么选择Abstract class over interface?

当我想为类的某些部分行为提供实现时。

  

如果一个类扩展了一个抽象类,我们是否应该在抽象中实现所有方法   类。如果一个类实现了一个接口,我们也应该实现所有方法。

具体类必须完全实现抽象接口。你别无选择,只能实现所有方法。这是因为无论何时实现接口或使用具体实现扩展抽象类,都要声明具体类完全描述了接口的行为。

当然,抽象扩展不必完全实现接口,即接口/抽象类的抽象扩展不必强制实现整个接口。

  

为什么要引入抽象类或接口模式?它们有什么用?它是否会处理对象实例化方式或行为方式的任何内容?

接口描述类型的行为。由于所有实现都必须完全描述接口强制执行的行为,因此它们允许多态性。

Canonical Collections Framework示例:

  1. List<E>界面描述了对象列表的行为方式。它描述了addremovegetset操作,仅举几例。
  2. 2. ArrayList<E>LinkedList<E>List<E>接口的两个具体实现。

    3.因此,保证它们都表现得像List<E>,更具体地说是addremoveget和{{1}的具体实现举几个例子。

    4.此外,由于它们都实现了相同的接口,更具体地说,它们都的行为就像set一样,我可以使用它们,无论我需要在哪里使用{{ 1}}。

    5.这允许这样的陈述:

    List<E>

    这是一个非常简单的多态行为示例。 List<E>方法接受并愉快地遍历List<String> names = new ArrayList<String>(); List<String> queue = new LinkedList<String>(); showList(names); showList(queue); void showList(List<String> list) { for(String s : list) System.out.println(s); } showList(List<String> list),因为它们都实现了相同的接口,并且可以确定它的行为。

答案 2 :(得分:1)

关于抽象类和接口

抽象类定义了某个实体的部分表示,这对每个扩展类都是通用的,但必须通过继承来完成。因此,每个继承类都包含每个父类中定义的所有属性。

接口为给定的类提供行为,并允许模拟类似于多重继承的东西。由于您可以在类中实现多个接口,因此您可以使该类采用每个实现接口的行为,并且一起使用。

经典例子: 抽象类:动物以抽象方式表示动物。每只动物都应该扩展这一类,以采用“成为”动物的所有含义。

抽象类:哺乳动物延伸动物哺乳动物是动物,并且继承了每种哺乳动物常见的所有特性。

有些哺乳动物是食肉动物,有些是食草动物。对于相同类型的动物来说,这些是不同的行为,因此它们来自界面。

界面:肉食定义食肉动物应具备的属性。

界面: Herbivorous 定义食草动物应具备的属性。

每个哺乳动物都应呼吸空气。这是另一种行为,对每个哺乳动物来说都是常见的。

界面 AirBreathing 定义吸气动物的属性

因此。你有这两种哺乳动物:狼和海牛。两者都要呼吸空气,但狼是食肉和海牛食草。

延伸哺乳动物实施 AirBreathing 肉食

Class Wolf 扩展哺乳动物实施 AirBreathing Herbivorous

实施细节

1)抽象类中定义的每个抽象方法都必须在继承的“路上”某处实现,直到达到最终类。这意味着当实现最终类时,它必须实现或继承从父类继承的每个抽象方法的实现。

2)是的,您可以在抽象类中定义静态方法。您可以将抽象类中的静态方法称为 AbstractClass.staticMethod(),但是您无法实例化抽象类。

3)实现接口的类必须实现接口定义的每个方法。

希望这有帮助。

答案 3 :(得分:1)

我刚完成学业并加入了一家公司。所以可能我可能无法给你很好的榜样,但从广义上讲,他们会工作,他们是有效的...... 使用接口的最重要原因是在相关类中创建一个共同的行为。 Wonderfull的例子是集合框架。其他集合是一个接口,可以确保代表某些对象集合的类,然后它应该强制实现所有集合方法(否则它们不会是集合,还要注意集合是一种行为),现在这个接口由其他进一步实现接口列表所以所有类型列表的集合都实现了这里(这里我们专门研究集合的行为(通过添加一些方法),注意列表也是一种行为)。现在我们想要一个只代表链接列表的数组集合的类,所以我们实现了list的所有方法(最终有了collection方法)。 现在来看抽象类,考虑java中Number类的例子,它是一个实现可序列化接口的抽象类,因为它必须显示序列化行为。另请注意,Number表示一些物理实体,因此它应该是一个抽象类。摘要因为从它我们不能得出确切的对象。虽然serializable是一种行为因此接口。 多数民众赞成我可以为您提供的,这就是我从我的基本知识中学到的东西。但永远记住oops与人不同。另请参阅封装实现抽象示例。所以一切都取决于你。