在 Java 的情况下,“抽象”和“通用”代码有什么区别?两者的意思一样吗?
4 回答
抽象和泛型在 Java 语法和语义上是完全不同的东西。
abstract 是关键字,表示一个类不包含完整的实现,因此不能实例化。
例子:
abstract class MyClass {
public abstract void myMethod();
}
MyClass 包含方法定义'public abstract void myMethod()',但没有指定实现——实现必须由子类提供,通常称为具体子类,因此抽象类定义接口,可能带有一些实现细节。
泛型的使用表明类的各个方面可以参数化。我发现最容易理解的例子是 Java Collections API。
例如List<String>
可以读作“字符串类型的对象列表”。List<Integer>
是相同的 List 接口,但只接受 Integer 类型的对象。
在 Collections API 中,它为集合提供了类型安全,否则这些集合需要样板来检查类型并进行适当的转换。
抽象的——脱离具体现实、特定对象或实际实例而思考。
在 Java 中,您可以在类和方法定义中找到抽象一词。它暗示该类不能被实例化(我只能作为超类使用),或者方法必须被子类覆盖。这方面的一个例子是 Animal 类,Animal 太模糊而无法从中创建实例,但是 Animals 共享应该在 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.
}
}
泛型——属于、适用于或指代一个属、类、组或种类的所有成员;一般的。
当明确声明某些容器对象中将包含什么类型的对象时,Java 中使用术语 Generic 或 Generics。以 ArrayList 为例,我们可以将任何我们想要的对象放入 ArrayList 中,但这很容易导致错误(您可能不小心在 ArrayList 中放入了一个用整数填充的字符串)。泛型是在 Java 中创建的,因此我们可以明确告诉编译器我们只需要 ArrayList 中的整数(使用泛型,当您尝试将字符串放入整数 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.
}
}
简短易懂的回答:
抽象代码表达了一个想法,而不是如何使它工作
通用代码适用于不止一种对象,并且知道你给了它什么类型
更长,但不是文字墙:
Abstract 指定一个接口,没有完整的实现
- 抽象类必须扩展才能使用,不能使用构造函数创建实例
- 抽象类不必为所有方法提供代码——它们可以只给出方法名称、返回值和抛出的检查异常
- 这意味着当您想允许某些东西以不同的方式工作时,您可以使用抽象方法。
示例:您可以编写一个抽象 Store 类,具有抽象的 storeValue 和 getValue 方法。然后,您使用数据库存储、磁盘存储、网络存储和内存存储的不同实现来扩展它。除了 storeValue 和 getValue 方法外,所有方法都使用相同的方法。您可以互换使用它们。
通用代码包括类型信息,并且可能适用于多种类型:
- 泛型并没有真正让你做任何你不能用普通对象输入/输出做的事情,还有很多“instanceof”检查和对象转换
- 不过,它们更容易阅读!
- 通用代码指定它使用的对象类型,并允许您对相同事物的组进行操作
- 通用代码允许您指定算法而不知道它在运行什么——当算法被调用时,它可以输出与输入相同的类型,无论输入可能是什么
- 如果您使用泛型对不同的对象类型进行操作,则不必强制转换为普通对象(并检查对象类型)
- 泛型最常见的地方是在集合上操作——你可以存储一些东西的集合,而不知道它到底是什么
- 泛型可能非常复杂
示例:您定义了一个“add”方法,该方法将 String(或类似)对象端到端添加,或对 Number 对象求和,或将一种类型的元素添加到包含该类型的 Collection
Abstract 用于定义在被认为“完整”(或在 Java-certification-test-terms 中具体)之前需要额外定义功能的东西。泛型意味着它是一个可以处理您在实例化该类时定义的各种数据类型的类。