Java 方法overriding中超类方法前的抽象关键字

Java 方法overriding中超类方法前的抽象关键字,java,inheritance,abstract-class,superclass,Java,Inheritance,Abstract Class,Superclass,由于无法在主函数中实例化超类对象,因此在类名之前指定了抽象关键字。但是,如果在超类覆盖方法之前使用抽象关键字,与不使用抽象关键字有什么区别。有人能解释一下吗 下面是一个例子。请检查注释部分 abstract class Figure { int dim1; int dim2; Figure() { dim1=-1; dim2=-1; } Figure(int p,int q) { dim1

由于无法在主函数中实例化超类对象,因此在类名之前指定了抽象关键字。但是,如果在超类覆盖方法之前使用抽象关键字,与不使用抽象关键字有什么区别。有人能解释一下吗

下面是一个例子。请检查注释部分

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();

    }

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

abstract void Area();
(不考虑违反命名约定等)

抽象方法的全部要点是强制子类提供实际实现,通常是因为抽象类本身不知道如何实现。如果可以在抽象类中提供一个实现,那么只需将其变成一个普通方法,如果它们愿意,可以被子类重写。

请注意,在没有抽象方法的情况下可以有一个抽象类,但这是相对不寻常的

有关详细信息,请参阅和。

使用
抽象
修饰符,这是无效代码-不能在声明抽象方法时指定其主体。应该是:

abstract void Area();
(不考虑违反命名约定等)

抽象方法的全部要点是强制子类提供实际实现,通常是因为抽象类本身不知道如何实现。如果可以在抽象类中提供一个实现,那么只需将其变成一个普通方法,如果它们愿意,可以被子类重写。

请注意,在没有抽象方法的情况下可以有一个抽象类,但这是相对不寻常的


有关详细信息,请参阅和。

标记方法摘要意味着类定义了该方法,但没有实现它。它强制具体的子类提供方法的实现

要么提供一个实现,而方法可能不是抽象的,要么不提供抽象的,而方法必须是抽象的(因此类也必须是抽象的)


阅读。

标记方法摘要意味着类定义了方法,但没有实现它。它强制具体的子类提供方法的实现

要么提供一个实现,而方法可能不是抽象的,要么不提供抽象的,而方法必须是抽象的(因此类也必须是抽象的)

读这本书

abstract
意味着它的主体将在它的派生类中定义

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

因此,根据经验:

抽象类可以有两种方法:带主体和不带主体。具有正文的方法不能以abstract关键字作为前缀。但是,没有正文的方法必须以abstract关键字作为前缀

abstract
意味着它的主体将在它的派生类中定义

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

因此,根据经验:

抽象类可以有两种方法:带主体和不带主体。具有正文的方法不能以abstract关键字作为前缀。但是,没有正文的方法必须以abstract关键字作为前缀


这与类型合同有关

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

然后,你可以把一个方法抽象出来,意思是“我不会给出这个方法的任何实现,我想强迫任何扩展这个类的人为这个方法提供一个实现”


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

这与类型合同有关

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

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

现在,由于抽象方法在声明它们的类中没有实现,当您使一个方法抽象时,编译器也会迫使您使其类抽象,因为您认为,当该类至少有一个没有实现的方法(抽象方法)时,直接实例化该类是没有意义的

  • 类可以有抽象方法和非抽象方法

  • 如果你在你的类中声明了一个抽象方法,你必须使你的类抽象。 (注:抽象方法仅指方法声明,不含任何正文。 在本例中,您必须选择两个选项之一:a)将您的方法声明为:abstract void area();b) 从方法和类中删除抽象关键字)

  • 如果一个类是抽象的,它必须由另一个抽象类或具体类扩展。 在你们的例子中,你们是以三角形和矩形的形式来做的,它们是图形的延伸

  • 所有抽象方法都必须由继承树中的第一个具体类实现。具体类是指可以实例化的类。 所以,如果在抽象类中有抽象方法(比如抽象void area();),那么必须在具体类(这里是矩形和三角形)中实现它(提供主体)