在什么情况下我需要扩展课程?

时间:2013-08-23 17:47:50

标签: java class extend

我正在学习java,并且想知道在什么情况下你想扩展一个像这里的类:

http://5upcodes.blogspot.fi/2013/08/java-inheritance.html

谢谢!

12 个答案:

答案 0 :(得分:4)

如果要创建一个通常类似于超类(要扩展的类)的类,则需要对其进行扩展并对其进行自定义。覆盖其中的一些功能,和/或添加功能。

答案 1 :(得分:3)

我最喜欢的继承示例是形状示例。所有正方形都是形状,但并非所有形状都是正方形。

假设您有一个名为“shape”的类。所有形状都有周长,区域等。这些是形状类的数据成员。

假设你想创建一个名为circle的类。 circle可以扩展您的形状类,以便它仍然具有形状类的数据成员,并且您可以添加特定于圆的元素,例如半径。 (正方形没有半径)。

圆形类将被称为从形状类“继承”,因为它具有形状的所有特征,以及仅特定于圆类的新特征。

答案 2 :(得分:2)

这是一个“is-a”场景,是三个OOP支柱之一(继承,封装,多态)。如果你有一个Animal类,那么你可能想要从Animal扩展一个Dog类。狗是动物,但不是相反。所有动物都有细胞,但除此之外,狗还有其他特征。这是一个非常基本的想法。

答案 3 :(得分:2)

由于简单的原因,我们将一个类扩展为另一个类,并将基础称为INHERITANCE。

比如说,如果你想创建一个程序,其中有两个车辆类别,即Car和Boat,除了一些之外,它们具有相似的属性。

public class Vehicle
{
  void engine()
}

protected class Car extends Vehicle
{
 void tyres()
}

protected class Boat extends Vehicle
{
 void propeller()
}

你看到两辆车都有发动机但有不同的模式,一个是轮胎帮助,另一个是螺旋桨。

所以,两个避免重写方法引擎的代码,我们在子类中继承它。 希望,这将有助于你!

答案 4 :(得分:1)

扩展类是OOP的基础知识之一,还有接口。可以说,你有一个名为Building的普通班级。它有会员,如地区,建筑物所在的城市(或坐标)等。

现在,通过扩展,您可以将house指定为“Cottage”,“SkyScraper”等。它们将具有父级+更多功能(例如,SkyScaraper的级别数)。

答案 5 :(得分:1)

OOP的良好做法是program towards interfaces。但在某些情况下,您可以利用继承来利用:例如,当您的顶级类具有明确定义的行为(我指的是具体代码)时,所有子类都将继承 - 这会减少代码,复杂性并为您提供更好的维护场景。

另一方面,如果你的模型过于抽象(基本行为不是很清楚),那么你应该考虑使用接口。

如果您正在创建真实软件,请不要忘记设计模式 - 有人可能已经解决了您的问题。

答案 6 :(得分:1)

使用继承的主要原因是扩展基类的行为。

例如,如果您正在制作视频游戏,则可能会有一个Character类,其中包含角色导航世界所需的所有代码,并执行其他任何操作。

然后您可以使用CharacterPlayer扩展NPC,以便Player(代表玩家角色)包含允许玩游戏的人控制的逻辑它们的字符和NPC(表示非播放器字符)包含允许计算机控制其他字符的逻辑。这样,每个字符的所有逻辑核心都封装在Character类中,而子类只具有扩展特定行为所需的逻辑。

例如,Character类可能有移动方法。

protected void MoveToLocation(x, y)
{
 //movement logic goes here
}

然后Player类可能包含一个mouselistener来将播放器移动到点击的位置。

public void mouseClicked (MouseEvent mouseEvent)
{
    MoveToLocation(mouseEvent.getX(), mouseEvent.getY());
}

NPC会以某种方式自行解决

protected void decideWhereToGo()
{
    int destinationX, destinationY;
    //logic for determining destination
    MoveToLocation(destinationX, destinationY);
}

因为它们都继承自Character,所以他们都知道如何MoveToLocation,如果你想改变完成的方式,你只需要在一个地方修改代码{{1} (无论它们是Character还是Player,它们仍然是NPC通过继承的方式)将具有更新的行为。

答案 7 :(得分:0)

当你扩展一个类时,你在原始的和新的之间有一个父子关系,扩展一个。

子类(扩展父类的子类)将拥有父类的每个成员,而不需要再次声明它们。即使是私人会员,但您无法直接访问它们。

如果希望新类具有原始的所有相同功能,则可以扩展类,等等。然后,子类可以添加新功能,或覆盖父类的某些功能。

当您希望拥有一组相关的类并共享一些常用功能时,您也可以使用扩展,但在详细信息方面具有不同的实现。例如,通常对于图形界面,您有一个Control类,它具有与渲染和定位相关的功能。然后你的孩子叫ButtonTextboxCombo等。所有人都有一些共同的实现,但每个都有不同的细节。

确保也要研究接口。有时您需要许多相关类,以便它们具有一组共同的成员,但没有共享功能。在这种情况下,实现接口可能比扩展公共类更好。接口就像一个类,但没有实现(它只用于告诉它实现者应该拥有哪些成员)。

答案 8 :(得分:0)

通常扩展一个类是为了根据某些东西创建类。例如,要创建活动,必须扩展活动。如果您的类要设置IntentService,那么您必须扩展您的类以使用IntentService。

public class AClassNameHere extends Activity  implements OnClickListener {

public class ClassName extends IntentService{

答案 9 :(得分:0)

您可以将超类扩展为Override超类方法以特定于子类 例如:

如果您的超类是具有泛型行为的泛型类,例如Animal类可以是类似

的泛型类
class Animal{
private String name;
public String getVoice(){
return "Animal";
}

}

现在你需要创建一个类型为Animal但类型不同的Cat类,然后只需扩展超类Animal并覆盖getVoice()方法 像

class Cat extends Animal{

public String getVoice(){
return "mew";
}   
}

现在,如果你有这样的代码: 动物猫=新猫(); cat.getVoice(); //它将返回“mew”

实际上你可以在很多情况下使用它 1.将现有框架类扩展到您的自定义类。 2.如果您正在开发任何框架,您可以公开一些您希望用户自定义的类。

但是重写引入了IS-A关系。

答案 10 :(得分:-1)

几乎没有。最好只扩展为其积极设计的类。大多数类实现者都没有考虑如果人们扩展他们的类会发生什么。有各种各样的问题。

作文是你最好的朋友。

漏洞包括

  • 您无法再在子类中正确实现equals()或hashCode()
  • 你违反了封装,现在依赖于另一个类的内部
  • 您很容易受到父类的更改
  • 您需要接受任何添加到父类的新方法
  • 你必须担心Liskov替换原则会导致微妙的错误

Josh Bloch在其优秀的书“Effective Java”第2版中,在几个地方讨论了这个问题,包括第8,16和17项。

答案 11 :(得分:-1)

继承有三个主要缺点。即使这种关系是一种“是一种”关系,但在决定继承一个类时,请考虑这三种关系。

  1. 无法进行部分继承。你不能部分扩展。
  2. 它是静态链接的。继承关系是静态的。您无法在运行时更改该关系。
  3. 您无法通过继承限制行为。 (这可以通过私有继承在C ++中实现。但不是在java中)