答案 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
类,其中包含角色导航世界所需的所有代码,并执行其他任何操作。
然后您可以使用Character
和Player
扩展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
类,它具有与渲染和定位相关的功能。然后你的孩子叫Button
,Textbox
,Combo
等。所有人都有一些共同的实现,但每个都有不同的细节。
确保也要研究接口。有时您需要许多相关类,以便它们具有一组共同的成员,但没有共享功能。在这种情况下,实现接口可能比扩展公共类更好。接口就像一个类,但没有实现(它只用于告诉它实现者应该拥有哪些成员)。
答案 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)
几乎没有。最好只扩展为其积极设计的类。大多数类实现者都没有考虑如果人们扩展他们的类会发生什么。有各种各样的问题。
作文是你最好的朋友。
漏洞包括
Josh Bloch在其优秀的书“Effective Java”第2版中,在几个地方讨论了这个问题,包括第8,16和17项。
答案 11 :(得分:-1)
继承有三个主要缺点。即使这种关系是一种“是一种”关系,但在决定继承一个类时,请考虑这三种关系。