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关键字作为前缀
这与类型合同有关 首先,您可以创建一个没有抽象方法的抽象类。这句话的意思是:“这个类不能被实例化,你必须扩展它,然后实例化那个类(只要那个类不是抽象的) 然后,你可以把一个方法抽象出来,意思是“我不会给出这个方法的任何实现,我想强迫任何扩展这个类的人为这个方法提供一个实现”
现在,由于抽象方法在声明它们的类中没有实现,当你使一个方法抽象时,编译器也会强迫你使它的类抽象,因为当它至少有一个没有实现的方法(抽象方法)时,直接实例化这个类是没有意义的.这与类型合同有关 首先,你可以创建一个没有抽象方法的抽象类。这意味着“这个类不能被实例化,你必须扩展它,然后实例化那个类(只要那个类不是抽象的) 然后,您可以将方法抽象化。这句话的意思是:“我不会给这个方法任何实现,我想强迫任何扩展这个类的人为这个方法提供一个实现。” 现在,由于抽象方法在声明它们的类中没有实现,当您使一个方法抽象时,编译器也会迫使您使其类抽象,因为您认为,当该类至少有一个没有实现的方法(抽象方法)时,直接实例化该类是没有意义的