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

3

知っておくべきことが2つあります

-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

すべての動物が 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

1 つのメソッドが異なる実装を持つ複数のサブクラスで実装できる場合に使用される抽象メソッド。

サブクラスは、抽象メソッドのさまざまな実装を提供する責任があります。

注:= 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 に答える