【问题标题】:Abstract Methods don't have body?抽象方法没有主体?
【发布时间】:2013-08-07 11:21:17
【问题描述】:

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

那么这是如何工作的呢?

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

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

例如

public void paint (Graphics g) {

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

}

【问题讨论】:

  • 继承的类很可能会实现它。您可以找到更多信息here
  • 这就像在问——我知道“猫是动物”,但“猫是动物”是怎么回事?
  • 你似乎错过了抽象方法的重点
  • 你不应该[只是]看书,你应该用代码弄脏你的手; ))

标签: java abstract abstract-methods


【解决方案1】:

有两件事你需要知道

-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;
        }
    }

【讨论】:

  • 对不起,我很痛苦。 fillRect 不提供定义。你把参数和它画一个矩形
  • 所以它是这样的 -(i) fillRect 在 java.awt 包的 Graphics 类中声明。 (ii) Applet 类扩展了 Graphics 类,因此具有 filRect() 的定义。 (iii) 现在你正在扩展 Applet 类,所以你可以只给出参数,并且使用 Applet 类中的 fillRect() 的主体。我希望这应该是正确的..但我仍然建议做一些研究...
【解决方案2】:

Also read docs

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

【讨论】:

    【解决方案3】:

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

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

    这就是你创建方法的原因

    public abstract void drive();
    

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

    【讨论】:

      【解决方案4】:

      当然,所有动物都有 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; } 
      
      }
      

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          doSomethingWithIt(MyAbstractClass argument);

          doSomethingWithIt方法只依赖于传递给它的object提供了MyAbstractClass中抽象方法的实现,但它不依赖于哪个派生类 正在提供该实现。

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

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

          【讨论】:

            【解决方案7】:

            关注

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

            仅对抽象类不起作用。它适用于子类。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-07-04
              • 2011-07-10
              • 1970-01-01
              • 2016-12-14
              • 1970-01-01
              • 2011-04-12
              • 2018-01-31
              相关资源
              最近更新 更多