Абстрактное ключевое слово перед методом Super Class в методе Over-riding - PullRequest
0 голосов
/ 07 февраля 2012

Поскольку объекты Super Class не могут быть созданы в основной функции, абстрактное ключевое слово указывается перед именем класса. Но какая разница, если абстрактное ключевое слово используется перед методом переопределения SuperClass или не используется.Может кто-нибудь объяснить это, пожалуйста?

Вот пример ниже. Пожалуйста, проверьте прокомментированную часть.

abstract class Figure
{
    int dim1;
    int dim2;

    Figure()
    {
        dim1=-1;
        dim2=-1;
    }

    Figure(int p,int q)
    {
        dim1=p;
        dim2=q;
    }

    abstract void Area() //This line is working without abstract for me.
    {
        System.out.println("The area is undefined.");
    }
}

class Rectangle extends Figure
{
    int vol;
    Rectangle()
    {
        super();
    }

    Rectangle(int p,int q)
    {
        super(p,q);
    }

    void Area()
    {
        vol=dim1*dim2;
        System.out.println("The area of the rectangle is: "+vol);
    }
}

class Triangle extends Figure
{
    int vol;
    Triangle()
    {
        super();
    }

    Triangle(int p,int q)
    {
        super(p,q);
    }

    void Area()
    {
        vol=dim1*dim2/2;
        System.out.println("The area of the rectangle is: "+vol);
    }
}


public class Area 
{
    public static void main(String[] args) 
    {

        Rectangle r=new Rectangle(10,20);
        Triangle t=new Triangle(6,10);
        Figure fref;

        fref=r;
        r.Area();
        fref=t;
        t.Area();

    }

}

Ответы [ 5 ]

2 голосов
/ 07 февраля 2012

С модификатором abstract это недопустимый код - вы не можете указать тело абстрактного метода в точке, где вы его объявили. Это должно быть просто:

abstract void Area();

(Это оставляет в стороне нарушение соглашений об именах и т. Д.)

Смысл абстрактного метода в том, чтобы заставить подклассы обеспечить фактическую реализацию, обычно потому, что сам абстрактный класс не знает, как это сделать. Если вы можете предоставить реализацию внутри абстрактного класса, попробуйте вместо этого сделать его обычным методом, который может быть переопределен подклассами, если они захотят.

Обратите внимание, что возможно иметь абстрактный класс без абстрактного метода, но это относительно необычно.

См. раздел 8.4.3.1 Спецификации языка Java и "абстрактную" часть руководства по Java для получения дополнительной информации.

1 голос
/ 07 февраля 2012
abstract void Area();

abstract означает, что его тело будет определено в производном классе.

если вы попытаетесь определить тело для него, это будет ошибка времени компиляции.

Итак, как правило:

Абстрактный класс может иметь два вида методов: с телом и без тела. Методы с телом не могут иметь префикс с абстрактным ключевым словом. Однако методы без тела должны иметь префикс с абстрактным ключевым словом.

0 голосов
/ 07 февраля 2012
  1. Класс может иметь как абстрактные, так и неабстрактные методы

  2. Если вы объявляете хотя бы один абстрактный метод в своем классе, вы должны сделать свой класс абстрактным. (Примечание: абстрактный метод означает объявление метода только без тела. В вашем случае вы должны выбрать один из двух вариантов: a) Объявите свой метод как: abstract void area (); б) Удалить абстрактное ключевое слово как из вашего метода, так и из класса)

  3. Если класс является абстрактным, он должен быть расширен другим абстрактным классом или конкретным классом. В вашем случае вы делаете в форме треугольника и прямоугольника, которые расширяют рисунок.

  4. Весь абстрактный метод должен быть реализован первым конкретным классом в вашем дереве наследования. Под конкретным классом подразумевается класс, который вы можете создать. Так что если у вас есть абстрактный метод в вашем абстрактном классе (скажем, abstract void area ();), то вы должны реализовать его (предоставить тело) в вашем конкретном классе (здесь Rectangle и Triangle в вашем случае).

Как правило: Если ваш суперкласс не абстрактный, то у вас есть возможность либо переопределить его метод в подклассе, либо нет. Но в случае абстрактного класса вы должны переопределить его в вашем первом конкретном классе, иначе компилятор выдаст вам ошибку.

0 голосов
/ 07 февраля 2012

Это касается контрактов типа.

Во-первых, вы можете создать абстрактный класс без абстрактных методов. Это говорит о том, что этот класс не может быть создан "как есть", вы должны расширить его, а затем создать экземпляр класса TH (если класс TH также не является абстрактным).

Затем вы можете сделать метод абстрактным. Это говорит о том, что «я не собираюсь давать какую-либо реализацию для этого метода, я хочу заставить любого, кто расширяет этот класс, предоставить реализацию для этого метода».

Теперь, поскольку абстрактные методы не имеют реализации в классе, который их объявляет, когда вы создаете абстрактный метод, компилятор заставляет вас также сделать его класс абстрактным, потому что вам не имеет смысла создавать экземпляр этого класса напрямую, когда он имеет по крайней мере один метод без реализации (абстрактный метод).

0 голосов
/ 07 февраля 2012

Пометка абстрактного метода означает, что класс определяет метод, но не реализует его. Это заставляет конкретные подклассы обеспечить реализацию метода.

Либо вы предоставляете реализацию, и метод может быть не абстрактным, либо вы не предоставляете его, и метод должен быть абстрактным (и, следовательно, класс также должен быть).

Прочитайте учебник по Java .

...