Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从总是被重写的抽象类继承方法有意义吗?_Java_Inheritance_Abstract Class - Fatal编程技术网

Java 从总是被重写的抽象类继承方法有意义吗?

Java 从总是被重写的抽象类继承方法有意义吗?,java,inheritance,abstract-class,Java,Inheritance,Abstract Class,抽象类GraphicObject中的draw和resize方法每次都会被另一个对象继承该类时覆盖,那么为什么还要在GraphicObject中包含这两个方法呢 编辑:我意识到我想附加的图像没有显示,所以它是: 正是为了强制子类重写这些方法,并提供一个在超类中保持抽象的实现。类似这样的方法可能会在其他操作中被超类调用,请查看template方法模式以了解想法。抽象类表示接口。它定义了每个子类必须履行的契约,即提供方法及其各自的实现。抽象方法,如接口,说“该方法必须存在于任何真实对象中,并带有此签名

抽象类GraphicObject中的draw和resize方法每次都会被另一个对象继承该类时覆盖,那么为什么还要在GraphicObject中包含这两个方法呢

编辑:我意识到我想附加的图像没有显示,所以它是:

正是为了强制子类重写这些方法,并提供一个在超类中保持抽象的实现。类似这样的方法可能会在其他操作中被超类调用,请查看template方法模式以了解想法。

抽象类表示接口。它定义了每个子类必须履行的契约,即提供方法及其各自的实现。

抽象方法,如接口,说“该方法必须存在于任何真实对象中,并带有此签名”,但保留在何处实现它的决定权

抽象类定义某些行为而不定义其他行为是相当常见的;当一组类共享某些行为但在其他行为中有所不同时,这一点非常有用。同样的道理也适用于抽象类的子类;它们本身可能是部分抽象的,只填充从它们派生的类所共有的一些行为


让一个超类提供一个行为的默认实现也很常见,该行为适用于它的大多数子类,但在一些行为不同的子类中被覆盖。

我认为您遗漏了一些关于面向对象编程和继承的关键概念。 假设您有一个
GraphicObject
类,其中
draw()
resize()
作为抽象方法

class GraphicObject {
    public abstract void draw();
    public abstract void resize();
}
当然,这两个emthod声明不包含任何可执行代码。它仅仅意味着:如果您想要创建一个
图形对象
,您必须为这些方法提供一个实现。但它也为使用
GraphicObject
实例的所有其他类提供了宝贵的提示

假设您有一个全局
渲染器
,它显示多个
图形对象
s:

class Renderer {
     public void render(List<GraphicObject> objects) {
         for (GraphicObject object : objects) {
             object.draw();
         }
     }
}
类渲染器{
公共void渲染(列出对象){
用于(图形对象:对象){
object.draw();
}
}
}

render()
方法调用
GraphicObject.draw()
,而不知道实现。基于
GraphicObject
声明,我们知道存在一个实现,它的签名,等等。

因为当非抽象部分调用它们时,当它们不存在时,它会非常惊讶。这可能会消除一些疑问-