abstract修饰抽象类和抽象方法。
包含抽象方法的类只能定义成抽象类,但是抽象类中可以没有抽象方法。
抽象方法没有方法体。只能由子类提供实现(重写)。
抽象类只能被继承,final修饰的类不能被继承,所以abstract和final不能共存。
抽象方法如下所示:
public abstract class Sharp//抽象类{ private String color; public abstract String getType();//抽象方法 public abstract double calPerimeter(); { System.out.println("执行抽象类Sharp中的初始化块"); } public Sharp() {} //Sharp的构造器,不是用于创建Sharp对象的,而是用于子类的调用 public Sharp(String color) { System.out.println("Sharp类的构造器"); this.color = color; } }
在上面的代码中,这个抽象类包含了初始化块、构造器。
下面定义一个三角形类,继承Sharp类,实现Sharp类中的抽象方法。
public class Triangle extends Sharp{ //定义三条边 private double a,b,c; public Triangle(String color,double a,double b,double c) { super(color); this.a=a; this.b=b; this.c=c; } //重写Sharp类中计算周长的抽象方法 public double calPerimeter() { return a+b+c; } //重写Sharp类中返回形状的抽象方法 public String get Type() { return "三角形"; } }
假设还有个Circle类继承了Sharp类,那么如下代码:
//测试类的main方法main(){ Sharp s1 = new Triangle("黑色",2,3,4); Sharp s2 = new Circle("黄色",3); Syso(s1.getType());//多态 Syso(s1.calPerimeter()); Syso(s2.getType()); Syso(s2.calPerimeter()); }
这段代码定义了2个Sharp类型的引用性变量,分别指向Triangle和Circle。s1和s2可以直接调用上面的方法,无需强制类型转换成其子类的类型。
注:利用抽象类和抽象方法可以充分发挥多态的优势,使用更加灵活。