抽象和通用代码之间的区别

时间:2009-08-02 21:25:35

标签: java generics abstract

Java的“抽象”和“通用”代码之间的区别是什么?这两个意思是一样的吗?

4 个答案:

答案 0 :(得分:6)

Abstract和Generics在Java语法和语义方面完全不同。

abstract是一个关键字,表示一个类不包含完整的实现,因此无法实例化。

示例:

abstract class MyClass {
  public abstract void myMethod();
}

MyClass包含方法定义'public abstract void myMethod()',但没有指定实现 - 实现必须由子类提供,通常称为具体子类,因此抽象类定义了一个接口,也许有一些实施细节。

泛型的使用表明可以参数化类的各个方面。我发现最容易理解的例子是Java Collections API。

例如,List<String>可以读作'String类型的对象列表'。 List<Integer>与List接口相同,但只接受Integer类型的对象。

在Collections API中,它为集合提供了类型安全性,否则需要样板来检查类型并进行适当的转换。

答案 1 :(得分:5)

  

摘要 - 除了具体的现实,特定的对象,   或实际情况。

在Java中,您可以在类和方法定义中找到单词abstract。它意味着该类无法实例化(我只能用作超类),或者必须由子类覆盖该方法。一个例子是Animal类,Animal太模糊不能创建一个实例,但是Animal共享应该在Animal类中定义的公共属性/功能。

public abstract class Animal{
   protected int calories;

   public void feed(int calories){
      weight += calories;
   }

   public abstract void move(); // All animals move, but all do not move the same way
                                // So, put the move implementation in the sub-class
}

public class Cow extends Animal{
    public void move(){
       // Some code to make the cow move ...
    }
}

public class Application{
   public static void main(String [] args){
      //Animal animal = new Animal()   <- this is not allowed
       Animal cow = new Cow() // This is ok.
   }
}
  

通用 - 适用于或引用a的所有成员   属,类,群或种类;一般

术语Generic或Generics在Java中用于明确声明某个容器对象中包含的对象类型。以ArrayList为例,我们可以将我们想要的任何对象放入ArrayList中,但是这很容易导致错误(你可能会意外地在你的ArrayList中填入一个填充了int的字符串)。泛型是用Java创建的,因此我们可以明确地告诉编译器我们只需要在ArrayList中使用int(使用泛型时,编译器会在您尝试将String放入整数ArrayList时抛出错误。)

public class Application{
   public static void main(String [] args){
      ArrayList noGenerics = new ArrayList();
      ArrayList<Integer> generics = new ArrayList<Integer>();

      nogenerics.add(1);
      nogenerics.add("Hello"); // not what we want, but no error is thrown.

      generics.add(1);
      generics.add("Hello"); // error thrown in this case

      int total;
      for(int num : nogenerics)  
          total += num;
      // We will get a run time error in the for loop when we come to the
      // String, this run time error is avoided with generics.
   }
}

答案 2 :(得分:3)

简短易懂的答案:

  • 抽象代码表达了一个想法,但没有表达如何使其发挥作用

  • 通用代码适用于多种对象,并知道您提供的对象


更长,但不是文字墙:

Abstract指定一个接口,没有完整的实现

  • 必须扩展抽象类 要使用,你无法创造 具有构造函数的实例
  • 抽象类不必为所有方法提供代码 - 它们只能提供方法名称,返回值和已检查的异常抛出
  • 这意味着当您希望允许某些工作方式不同时,您可以使用抽象方法。

示例:您可以使用抽象storeValue和getValue方法编写抽象Store类。然后,使用不同的数据库存储,磁盘存储,网络存储和内存存储实现扩展它。除了storeValue和getValue方法之外,所有方法都使用相同的方法。您可以互换使用它们。

通用代码包含类型信息,可以使用多种类型:

  • 泛型并不能让你做任何你不能用vanilla Object输入/输出做的事情,以及很多“instanceof”检查和对象转换
  • 但它们更容易阅读!
  • 通用代码指定它使用的对象类型,并允许您对同一组的对象进行操作
  • 通用代码允许您在不知道其操作的情况下指定算法 - 调用算法时,它可以输出与输入相同的类型,无论输入是什么
  • 如果使用Generics操作不同的对象类型,则不必强制转换为vanilla对象(并检查对象类型)
  • 泛型的最常见的地方是对集合进行操作 - 你可以存储一些东西,而不知道究竟是什么
  • 泛型可能非常复杂

实施例:  你定义一个“添加”方法,它首尾相连地添加String(或类似)对象,或者对Number对象求和,或者将一种类型的元素添加到包含该类型的Collection中

答案 3 :(得分:2)

Abstract用于定义在被认为是“完整”之前需要额外定义功能的东西(或者在Java认证测试术语中具体)。泛型意味着它是一个可以处理实例化类时定义的各种数据类型的类。