我是 Java 新手(已经读书 4 个月了)。所以我的问题可能显得太简单了。我的理解是抽象方法没有主体,不能提供实现
那么这是如何运作的?
public abstract void fillRect (int x, int y, with, height);
我没有明确指出问题。我们有抽象方法。如果我不提供主体,只提供参数,为什么它会绘制一个矩形。
例如
public void paint (Graphics g) {
g.fillRect (5, 5, 30, 30);
}
当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。但是,如果没有,则还必须声明子类
。
abstract
有两件事你需要知道
-声明:方法的原型或结构。例如:
public int add(int a, int b);
-定义:方法的实现
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;
}
}
您可以将抽象类和抽象方法视为一种契约。如果你有一个抽象类(任何具有抽象方法的类都成为抽象类),你无法创建该类的对象。
您可能想知道在这种情况下抽象类有什么用。这就是合同发挥作用的地方。假设您有一个类 Vehicle,具有方法驱动器。您希望所有车辆都能够行驶,但您还不知道如何行驶(汽车的行驶方式与自行车不同)。
这就是您创建该方法的原因
public abstract void drive();
并在您的子类 Car 和 Bycicle 中实现它。
假设所有动物都有 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; }
}
每个物种都有不同的计算腿/爪子的方法 - 你无法计算抽象动物,因为根本不存在抽象动物,只有具体物种个体。
当一种方法可以在多个具有不同实现的子类中实现时使用抽象方法。
子类负责提供抽象方法的不同实现。
注意:= 一个抽象类扩展了另一个抽象类。
注意:=我们无法创建抽象类 objcet。
如果类有抽象方法,则无法从中实例化对象。您可以从实现抽象方法的派生类实例化对象。
但是,您可以指定其他方法/函数的参数属于“抽象类”,例如,
doSomethingWithIt(MyAbstractClass argument);
并且方法
doSomethingWithIt
仅依赖于传递给它的object提供了MyAbstractClass中抽象方法的实现,但它不依赖于哪个派生类提供了该实现。
因此,抽象方法很有用,例如,如果您喜欢对同一方法使用不同的实现。
这是面向对象的核心技术,我认为所有书籍都涵盖了它。
以下
public abstract void fillRect (int x, int y, with, height);
仅不适用于抽象类。它将与子类一起使用。
创建抽象类的子类,然后用实现覆盖它。