Java中是否可以继承(从)非抽象类?

7

在Java中,一个类是否需要使用abstract关键字呢?或者说,它是否需要包含未实现的(抽象)方法呢?任何普通类都能被继承吗?


1
请查看http://docs.oracle.com/javase/tutorial/java/javaOO/classes.html。 - DNA
2
你尝试过它,发生了什么事情呢 :-) - kleopatra
7个回答

5

是的,所有非 final 的方法(静态方法与其他方法略有不同)都可以被覆盖,除非该类本身被声明为 final。如果在基类中没有提供任何实现,则只能使用抽象方法。


4

任何普通类都可以被扩展吗?

是的 :) 除非它有final修饰符。


3

不需要使用"abstract"这个单词,使用这个单词会导致你无法直接创建该类的实例。如果使用"abstract",只能创建继承该抽象类的类的实例。

AbstractClass abs = new ChildClass();

1

是的,您可以扩展一个类而无需将其定义为抽象类。这意味着您将覆盖方法。例如,您可能会创建一个类

DifferentString extends String

那么,

public String toString()
{
    return "Something different";
}

这意味着您可以更改父类的原始行为。
参考:

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html


1

是的,但是如果类被标记为final,则无法扩展。

class Foo {
    //some code here
}

class Boo extends Foo {

}

1

正如其他人所说,是的 - 但如果可能的话最好避免这样做,因为你可能更容易遇到所谓的脆弱基类问题。


如此脆弱的基类基本上是指,超类方法的更改导致子类中出现意外行为。但如果在子类中覆盖了相同的方法,是否可能呢? - Nitin Garg
1
是的,如果被覆盖的方法依赖于超类中的任何其他方法。即使超类仍然履行其契约,对超类进行简单更改也可能导致子类中出现意外行为。 - Robert
从维基百科页面上,我了解到使用接口可以解决这个问题。但是,使用抽象关键字如何防止这个问题?(或者说,不使用抽象关键字会导致什么问题?)抱歉,我还没有完全理解。 - Nitin Garg
重要的是尽可能避免扩展具体类,这样可以最大程度地减少FBC的机会。抽象类提供了一个折中点,在这里,您可以实现高级算法并将具体细节委托给其子类。例如,请参见模板方法设计模式。 - Robert

0

这里存在一些概念上的混淆。未实现的方法存在于一个接口中,而你可以实现该接口。

只要不是final类,你都可以扩展它。

编辑:我的意思是最好也将未实现的方法放在接口中。抽象类也可以有未实现的方法,但你最终会得到一个复杂和严格的层次结构。


我说抽象类必须至少有一个未实现的方法是正确的吗? - Nitin Garg
不行。它可能有方法,也可能没有。 - n_x_l
@why-el 我的意思是,最好也将未实现的方法放在接口中 - 我不确定是否同意。接口和抽象方法/类具有不同的目的。接口是关于解耦的,抽象类是关于可扩展性和共同基础功能。一个既不暗示也不需要另一个。将抽象方法也放在接口中可能会令人困惑,因为这意味着该方法是合同的一部分,而不是通常情况下期望实现以完成抽象基类的功能。 - pap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接