下面是《抽象方法和抽象类》这一节的完整攻略。
抽象方法和抽象类
什么是抽象方法?
抽象方法是一种没有具体实现的方法,它只有方法头(方法名、参数列表)而没有方法体。在Java中,我们通过关键字abstract
来声明一个抽象方法。
public abstract int getArea();
上述代码中的getArea()
方法是一个抽象方法,它没有方法体(即花括号内没有具体实现的语句),只有方法头,并且前面有一个abstract
关键字。
什么是抽象类?
抽象类是一个不能被实例化的类,它本身就是一个不完整的类,因为其中包含着抽象方法。在Java中,我们同样通过关键字abstract
来声明一个抽象类。
public abstract class Shape {
public abstract int getArea();
}
上述代码中的Shape
类就是一个抽象类,其中的getArea()
方法是一个抽象方法。由于抽象类中包含着抽象方法,因此它不能被实例化,即我们不能通过new
关键字来创建Shape
类的实例。
如何使用抽象类和抽象方法?
我们通常会定义一个抽象类作为其他子类的父类,这样所有的子类就都必须实现抽象类中的抽象方法。如果一个子类没有实现抽象类中的所有抽象方法,那么它也必须声明为抽象类。
public abstract class Shape {
public abstract int getArea();
}
public class Rectangle extends Shape {
private int width;
private int height;
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public int getArea() {
return width * height;
}
}
public class Circle extends Shape {
private int radius;
public void setRadius(int radius) {
this.radius = radius;
}
public int getArea() {
return (int)(Math.PI * radius * radius);
}
}
上述代码中,我们定义了两个子类Rectangle
和Circle
,它们都继承自抽象类Shape
。Shape
类中定义了一个抽象方法getArea()
,因此Rectangle
类和Circle
类都必须实现该方法。在Rectangle
类中,我们按照矩形的求面积公式实现了getArea()
方法;在Circle
类中,我们按照圆的求面积公式实现了getArea()
方法。
这样,我们就可以定义一个Shape
类型的变量,并用它来引用任意一个Rectangle
对象或Circle
对象。由于Rectangle
和Circle
都是Shape
的子类,因此它们都有一个getArea()
方法,因此我们可以通过Shape
类型的变量来调用它们的getArea()
方法,而无需关心它们的具体实现。
public class TestShape {
public static void main(String[] args) {
Shape s1 = new Rectangle();
((Rectangle)s1).setWidth(5);
((Rectangle)s1).setHeight(10);
System.out.println("Rectangle area: " + s1.getArea());
Shape s2 = new Circle();
((Circle)s2).setRadius(5);
System.out.println("Circle area: " + s2.getArea());
}
}
上述代码中,我们定义了一个TestShape
类,其中我们分别创建了一个Rectangle
对象和一个Circle
对象,并将它们赋给了一个Shape
类型的变量s1
和s2
。接着,我们通过强制类型转换将Shape
类型的变量转换为Rectangle
类型或Circle
类型,并分别设置了Rectangle
对象的宽度和高度以及Circle
对象的半径。最后,我们调用它们的getArea()
方法并打印结果。
输出结果为:
Rectangle area: 50
Circle area: 78
通过上述示例,我们可以看到,抽象类和抽象方法为我们提供了一种非常方便的方式来实现多态性。我们只需要定义一个抽象类和一些实现了该抽象类的子类,并在抽象类中定义一些抽象方法,就可以在调用子类对象的方法时体现出多态性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:第十节 抽象方法和抽象类 [10] - Python技术站