版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
抽象类:
-
抽象方法和抽象类
-
抽象类的作用
当编写一个类的时候,常常考虑为该类定义一些方法,用以描述该类的行为方式,那么这些方法都是具体的方法体,但是在某些情况下,某些父类只知道其子类应该包含怎样的方法,但是无法知道子类如何实现这些方法,这里就出现了抽象类以及抽象方法。
1,抽象方法和抽象类
抽象方法和抽象类必须使用abstract修饰符来修饰,有抽象方法的类必须被定义为抽象类,而抽象类里可以没有抽象方法。
抽象类和抽象方法的定义规则如下:
- 抽象类和抽象方法都必须使用abstract来修饰,并且抽象方法没有方法体。
- 抽象类不能被实例化,无法使用new关键字来调用抽象类构造器创建抽象类的实例,即使抽象类中没有抽象方法,也不能创建实例。
- 抽象类中可以包含五种成分,成员变量,方法,初始化块,构造器,内部类。
- 包含抽象方法的类只能被定义为抽象类。
定义抽象方法只需在普通方法前面加abstract修饰符,然后去掉方法体(就是花括号中的部分)。
看下面的代码:
public abstract class Shape {
{
System.out.println("初始化");
}
private String color;
public abstract double calPerimeter();
public abstract String getType();
public Shape(){};
//构造器并不是用于创建shape对象,而是用于被子类调用
public Shape(String color){
System.out.println("执行shape构造器");
this.color=color;
}
public void setColor(String color){
this.color=color;
}
public String getColor(){
return color;
}
}
在上面的代码中包含两个抽象方法,calperimeter和gettype,并且shape中包含了初始化块,构造器,这些不是用于创建父类对象,而是在创建子类实例的时候被调用,因为子类继承了父类。
下面定义一个三角形类:
public class Triangle extends Shape {
private double a;
private double b;
private double c;
public Triangle(String color,double a,double b,double c){
super(color);
this.setSide(a,b,c);
}
public void setSide(double a,double b,double c){
this.a=a;
this.b=b;
this.c=c;
}
public double calPerimeter(){
return a+b+c;
}
public String getType(){
return "三角形";
}
}
因为三角形类被定义为普通类,所以必须 实现shape中的所有抽象方法。
下面再定义一个Triange类继承shape类,并且实现shape类中的抽象方法。
public class Circle extends Shape {
private double radius;
public Circle(String color,double radius){
super(color);
this.radius=radius;
}
public void setRadius(double radius){
this.radius=radius;
}
@Override
public double calPerimeter() {
return 2*Math.PI*radius;
}
@Override
public String getType() {
return getColor()+"圆形";
}
public static void main(String[] args) {
Triangle s1=new Triangle("黑色",3,4,5);
Shape s2=new Circle("黄色",3);
System.out.println(s1.getType());
System.out.println(s1.calPerimeter());
System.out.println(s2.getType());
System.out.println(s2.calPerimeter());
}
}
代码编译结果:
初始化
执行shape构造器
初始化
执行shape构造器
三角形
12.0
黄色圆形
18.84955592153876
Process finished with exit code 0
从编译的结果可以看出,在创建子类实例的时候,因为子类对父类实现了继承,所以在父类中的初始化以及构造也运行了,但是这不是对于父类的实例化操作。
优势:利用抽象类和抽象方法能更好实现多态的操作。
2,抽象类的作用:
从上面的实例可以看出,抽象类不能创建实例,只能当作父类来进行继承,所以抽象类被看作是多个类的通用模板,子类在父类上进行扩展,改造。
模板模式在面向对象的软件中很常用,我们来看看他的规则:
- 抽象类定义方法,把不能实现的抽象方法留给子类来实现。
- 父类中的方法中需要调用其它的方法,这个方法既可以由子类实现也可以是父类实现。