0

我只是想让自己对 java api 感到满意。但我无法做到。不知道何时使用抽象类的目的。

考虑 java 库集合

                          Collections

            List                                Set

所有 3 都是接口,但最重要的是,尽管它们具有常见的功能,即 add、addAll、contains、containsAll 等。 List 以自己的方式实现,而 set 以另一种方式实现(讲述重复)。设置不允许重复列表允许重复。

所以我想说的是,当子实体和超实体没有共同特征时,我们必须去接口

更清楚地说,如果假设我们将 Collection 设置为抽象类,我们需要正确定义一些方法,而不仅仅是声明,但是 list 和 set 的功能是不同的(没有共同的定义),因此他们只是将其声明为接口并制定了强制规则 list 和 set 都应该实现这一点。

但是,如果有一些共同的功能,那么两者都将其保留为抽象类。

因此,从 Java 本身获取一个示例。让我们考虑一下抽象的 Number 类。让我们看看为什么现在不能使用界面完成!

**public abstract class Number
extends Object
methods are**

byte byteValue() 以字节形式返回指定数字的值。

abstract double doubleValue() 以双精度形式返回指定数字的值。

abstract float floatValue() 以浮点数形式返回指定数字的值。

abstract int intValue() 以 int 形式返回指定数字的值。

abstract long longValue() 以 long 形式返回指定数字的值。

short shortValue() 以短整数形式返回指定数字的值。

现在这里的 byteValue 是一个非抽象方法,而其他方法 XXXValue 是抽象的。我们会看到Y???

字节值()

// taken from Number class java doc api

public byte byteValue()

以字节形式返回指定数字的值。这可能涉及舍入或截断。

And this byteValue() method is being overriden by all the other classes like Integer,Double,Float etc.

相反,他们可以保持 byteValue() 也抽象!但他们力不从心。想知道他们为什么这样做。

4

2 回答 2

1

byteValue()在所有 Number 子类中都没有被覆盖。例如,它不在 BigInteger、AtomicInteger、AtomicLong、BigDecimal 中。所有这些类都受益于 Number 类中的默认实现。

于 2012-05-18T08:49:01.747 回答
1

接口无法为byteValue()和提供默认功能shortValue()。在这种情况下,默认行为是调用这些方法中的每一个intValue()与使用正确的强制转换调用相同。

此外,考虑Numberis not final,其他人可以在他们自己的代码库中扩展它,并有效地继承这些方法的行为。

简单地说(非常),如果您只想指定方法签名(即所有方法都是abstract),您可以(并且可能应该)定义一个接口。

于 2012-05-18T08:52:03.460 回答