由于超类对象无法在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();
}
}
答案 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)
标记方法抽象意味着类定义方法,但不实现它。它强制具体的子类提供该方法的实现。
要么提供实现,要么方法可能不是抽象的,或者你没有提供,并且方法必须是抽象的(因此类也必须是)。
答案 3 :(得分:0)
它与类型合同有关。
首先,您可以创建一个没有抽象方法的抽象类。这个sais“这个clas不能实例化,你必须扩展它然后实例化那个类(只要THAT类也不是抽象的)。
然后,您可以将方法抽象化。这个sais“我不会给这个方法任何实现,我想强迫任何扩展这个类的人为该方法提供一个实现”。
现在,由于抽象方法在声明它们的类中没有实现,所以当你创建一个方法抽象时,编译器会强迫你使它的类抽象,因为你直接实例化那个类是没有意义的。至少有一个方法没有实现(抽象方法)。
答案 4 :(得分:0)
一个类可以有抽象方法和非抽象方法
如果在类中声明一个抽象方法,则必须使您的类抽象化。 (注意:抽象方法仅指没有任何主体的方法声明。 在您的情况下,您必须选择以下两个选项之一:a)将您的方法声明为:abstract void area(); b)从你的方法和类中删除抽象关键字)
如果一个类是抽象的,那么它必须由另一个抽象类或具体类扩展。 在你的情况下,你正在以三角形和矩形的形式进行扩展图。
所有抽象方法必须由继承树中的第一个具体类实现。具体类是指可以实例化的类。 因此,如果你的抽象类中有抽象方法(比如abstract void area();),那么你必须在你的具体类中实现它(提供body)(在你的情况下这里是Rectangle和Triangle)。
根据经验: 如果你的超类不是抽象的,那么你可以选择在子类中覆盖它的方法。 但是在抽象类的情况下,你必须在第一个具体类中覆盖它,否则编译器会给你一个错误。