你能举例说明为什么java抽象方法不能存在于非抽象类中吗?

zed5wv10  于 2021-07-03  发布在  Java
关注(0)|答案(5)|浏览(463)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

上个月关门了。
改进这个问题
我想要一个真实的类型示例来说明为什么java抽象方法不能存在于非抽象类中。
我很理解为什么不能这样做——抽象类强制实现其中包含的任何抽象方法——但是一个可以理解的具体例子确实可以帮助我在头脑中解释清楚,非常感谢。

t30tvxxf

t30tvxxf1#

就像一个 abstract a中的方法 class ,方法来自 interface (隐式抽象的)允许对抽象进行建模。与多种类型相关的东西,但每个部分的行为都不同。
考虑一个简单的车辆,它可以 drive() ,那个´这是车辆的一个共同点。

public interface Vehicle {
    void drive();
}

现在,您不能创建 Vehicle 就其本身而言: Vehicle v = new Vehicle() . 考虑构建能够驱动的任务。你只关心它能开,与它做得多么出色无关。你说的是一个抽象,但你总是需要一个具体的实现,一个实际上能够做到的东西。那个´这就是为什么不能示例化抽象类。它是不完整的,缺少一些抽象的必需部分。
因此,每辆车的驾驶方式各不相同,如下所示:

public class Car implements Vehicle {
    public void drive() {
        if(isEngineTurnedOn()) {
            GearState state = getCurrentGearState();
            if(state == GearState.BACKWARDS) {
                // ...
            } else {
                engine.setSpeed(currentSpeed);
            }
            // ...
        }
    }
}

public class Boat implements Vehicle {
    public void drive() {
        if(isEngineTurnedOn()) {
            rotor.setAngleInDegrees(currentAngle);              
            rotor.setSpeed(currentSpeed);
            // ...
        }
        // ...
    }
}

然后,如果你再要能开车的东西,你可以递给打电话的人一个 new Car() ,它有能力这样做。因为打电话的人只是对 drive() ,你可以给他一个 new Boat() 也。

kzipqqlq

kzipqqlq2#

抽象类意味着不能直接示例化该类。如果一个类有一个抽象方法,那么它就不能被直接示例化,因为这个方法没有定义。因此,任何带有抽象方法的类都是无法示例化的抽象类。java只是让您给它贴上这样的标签。

xoefb8l8

xoefb8l83#

前言:我试着让它简单和合乎逻辑,但这可能不是一个确切的逻辑解释,但这肯定会帮助你在你的头脑中的原因,只是知道有规则,你必须遵循。在每一种语言中,你都可能会遇到这样的规则,这些规则看起来有点令人困惑,有点可疑。
让我们试着这样理解:
没有定义的方法是不完整的,在非抽象(完整)类中使用抽象(不完整)方法会增加该类的不完整性,并使该类不完整。现在您不能示例化这个类,因为它是不完整的(抽象的)。
这是没有意义的,因为你可以使用抽象类,为什么要把一个非抽象类变成抽象类。这就是为什么这是不允许的。
但如果您想做这样的事情,可以将定义为空的方法添加到非抽象类中。
p、 我知道这是你在so和-4上的第一个问题,只是不要失去动力,继续学习,继续问问题。

y1aodyip

y1aodyip4#

另一种观点是“为什么我必须提供我的接口的实现?”
答案是因为接口方法是隐式的 abstract . 所以您必须提供一个实现(或者一个空的主体)。否则,您将得到一个编译器错误,因为没有方法体,因此没有合法的方法可调用(jvm将不知道如何处理它—对于非void返回类型,它将做什么?)。
现在,如果将同一个类声明为abstract,则不需要实现。然后你就回到前面的问题,答案是一样的。抽象方法不能被调用,所以允许示例化包含它们的类是没有意义的。

sz81bmfz

sz81bmfz5#

抽象类和非抽象类之间的一个关键区别是不能创建抽象类的示例。这可以防止调用没有定义的方法。
如果我们有以下抽象类:

abstract class Elephant {    // abstract class

    public String getName() {
        return "Ollie";
    }

    public abstract void walk();   // abstract method

}

那么以下行为将是非法的:

Elephant e = new Elephant();   // error

因为 Elephant 是抽象的,不能示例化。
但为了论证,我们 Elephant 非抽象但允许仍有抽象方法 walk() . i、 我们改变了 Elephant 收件人:

class Elephant {    // non-abstract class

    public String getName() {
        return "Ollie";
    }

    public abstract void walk();    // abstract method

}

现在,如果我做以下操作,会发生什么:

Elephant e = new Elephant();   // legal since Elephant is non-abstract
e.walk();   // oops, we didn't define this anywhere

java编译器不允许这样做。您可能会认为还有其他方法可以处理这种情况,但这只是java语言决定如何实现该特性的原因。

相关问题