方法覆盖中超类方法前的抽象关键词

时间:2012-02-07 15:15:54

标签: java inheritance abstract-class superclass

由于超类对象无法在main函数中实例化,因此在类名之前指定了abstract关键字。但是,如果在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 个答案:

答案 0 :(得分:2)

使用 abstract修饰符,这是无效代码 - 您无法在声明它时指定抽象方法的主体。它应该只是:

abstract void Area();

(这是违反命名惯例等。)

抽象方法的重点是强制子类提供实际的实现,通常是因为抽象类本身不知道如何实现。如果你可以在抽象类中提供一个实现,那么可以考虑让它成为一个普通的方法,如果他们愿意的话可以被子类覆盖。

请注意,可能有一个没有抽象方法的抽象类,但它相对不常见。

有关详细信息,请参阅section 8.4.3.1 of the Java Language Specification"abstract" part of the Java tutorial

答案 1 :(得分:1)

abstract void Area();

abstract表示它的主体将在其派生类中定义。

如果你试图为它定义一个主体,它将是编译器时间错误。

所以,根据经验:

  

抽象类可以有两种方法:body和without body。 body的方法不能以abstract关键字为前缀。但是,没有body的方法必须以abstract keyword为前缀。

答案 2 :(得分:0)

标记方法抽象意味着类定义方法,但不实现它。它强制具体的子类提供该方法的实现。

要么提供实现,要么方法可能不是抽象的,或者你没有提供,并且方法必须是抽象的(因此类也必须是)。

阅读Java tutorial

答案 3 :(得分:0)

它与类型合同有关。

首先,您可以创建一个没有抽象方法的抽象类。这个sais“这个clas不能实例化,你必须扩展它然后实例化那个类(只要THAT类也不是抽象的)。

然后,您可以将方法抽象化。这个sais“我不会给这个方法任何实现,我想强迫任何扩展这个类的人为该方法提供一个实现”。

现在,由于抽象方法在声明它们的类中没有实现,所以当你创建一个方法抽象时,编译器会强迫你使它的类抽象,因为你直接实例化那个类是没有意义的。至少有一个方法没有实现(抽象方法)。

答案 4 :(得分:0)

  1. 一个类可以有抽象方法和非抽象方法

  2. 如果在类中声明一个抽象方法,则必须使您的类抽象化。 (注意:抽象方法仅指没有任何主体的方法声明。 在您的情况下,您必须选择以下两个选项之一:a)将您的方法声明为:abstract void area(); b)从你的方法和类中删除抽象关键字)

  3. 如果一个类是抽象的,那么它必须由另一个抽象类或具体类扩展。 在你的情况下,你正在以三角形和矩形的形式进行扩展图。

  4. 所有抽象方法必须由继承树中的第一个具体类实现。具体类是指可以实例化的类。 因此,如果你的抽象类中有抽象方法(比如abstract void area();),那么你必须在你的具体类中实现它(提供body)(在你的情况下这里是Rectangle和Triangle)。

  5. 根据经验: 如果你的超类不是抽象的,那么你可以选择在子类中覆盖它的方法。 但是在抽象类的情况下,你必须在第一个具体类中覆盖它,否则编译器会给你一个错误。

相关问题