4

我是 Java 新手(现在看书 4 个月了)。所以我的问题可能看起来太简单了。我的理解是抽象方法没有主体,不能提供实现

那么这是如何工作的呢?

public abstract void fillRect (int x, int y, with, height);

我没有明确指出这个问题。我们有抽象方法。如果我不提供主体,只提供参数,为什么它会绘制一个矩形。

例如

public void paint (Graphics g) {

g.fillRect (5, 5, 30, 30);

}
4

7 回答 7

8

另请阅读文档

当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。但是,如果不是,则子类也必须声明为抽象的。

于 2013-08-07T11:24:07.390 回答
3

有两件事你需要知道

-declaration:方法的原型或结构。例如:

    public int add(int a, int b);

-definition : 方法的实现

    public int add(int a, int b) {
        this.a = a;
        this.b = b;
        return a + b;
    }

现在一个抽象方法可以有一个声明,即一个结构或原型。但它不能有定义。定义应该在扩展包含抽象方法的类的类中完成:

    class A {
        public abstract int add(int a,int b); //just declaration- no body
    }
    class B extends A {
        /*must override add() method because it is abstract in class A i.e class B must have a body or definition of add()*/ 
        int a, b;
        public int add(int a,int b) {
            this.a = a;
            this.b = b;
            return a + b;
        }
    }
于 2013-08-07T11:28:23.720 回答
1

您可以将抽象类和抽象方法视为一种契约。如果您有一个抽象类(任何具有抽象方法的类都将成为抽象类),则您不能创建该类的对象。

您可能想知道在这种情况下抽象类有什么用。这就是合同发挥作用的地方。假设你有一个类 Vehicle,它有一个方法 drive。您希望所有车辆都能驾驶,但您还不知道如何驾驶(汽车的驾驶方式与自行车不同)。

这就是你创建方法的原因

public abstract void drive();

并在您的子类 Car 和 Bycicle 中实现它。

于 2013-08-07T11:25:29.770 回答
1

假设所有动物都有 0 到 n 条腿:

abstract Class Animal{

    public abstract int legCount();

}

Class Dolphin extends Animal{

    public int legCount(){ return 0; } 

}

Class Cat extends Animal{

    public int legCount(){ return 4; } 

}

Class Man extends Animal{

    public int legCount(){ return 2; } 

}

每个物种都有不同的计算腿/爪子的方法——你不能为抽象的动物做,因为根本没有抽象的动物,只有具体的物种个体。

于 2013-08-07T11:30:48.277 回答
1

当一种方法可以在多个具有不同实现的子类中实现时使用的抽象方法。

子类负责提供抽象方法的不同实现。

注意:= 一个抽象类扩展了另一个抽象类。

注意:= 我们不能创建抽象类对象。

于 2013-08-07T11:31:04.683 回答
1

如果一个类有一个抽象方法,你不能从它实例化一个对象。您可以从实现抽象方法的派生类中实例化对象。

但是,您可以指定某个其他方法/函数的参数属于“抽象类”,例如,

doSomethingWithIt(MyAbstractClass argument);

并且该方法doSomethingWithIt仅依赖于传递给它的对象提供了 MyAbstractClass 中抽象方法的实现这一事实,但它不依赖于哪个派生类提供该实现。

因此,抽象方法很有用,例如,如果您想对同一方法使用不同的实现。

这是 OO 的核心技术,我假设所有书籍都涵盖了它。

于 2013-08-07T11:31:05.993 回答
0

下列的

public abstract void fillRect (int x, int y, with, height);

仅适用于抽象类。它将与子类一起使用。

创建抽象类的子类,然后用实现覆盖它。

于 2013-08-07T11:28:58.337 回答