在某些情况下,父类只知道子类该实现什么样的方法,而不知道方法的具体实现,就可以定义抽象类,例如:父类shape,子类:circle;父类提供了计算周长的方法,但子类实现周长计算的方法是不一样的,比如,圆形,三角形;抽象类只提供方法签名,没有实现(由其子类实现)。
类和方法都是由abstract修饰。
package com.creditharmony.adapter.testCase.test; /* * 抽象类 * */ public abstract class ShapeTest { { System.out.println("这是抽象类里的初始化块"); } private String color; // 计算周长的抽象方法 public abstract double caperimagter(); // 返回形状的抽象方法 public abstract String getType(); // 定义构造器,该构造器不是用来生成对象,而是用来被对象调用 public ShapeTest(){}; // 再来一个 public ShapeTest(String color) { System.out.println("执行形状的构造器……,color:"+color); this.setColor(color); } public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
三角形类:
package com.creditharmony.adapter.testCase.test; public class TriangleShape extends ShapeTest { // 定义三角形的三条边 private double a; private double b; private double c; @Override public double caperimagter() { return a + b + c; } @Override public String getType() { // 返回形状 return "三角形"; } public TriangleShape(String color, double a, double b, double c) { super(color); setSides(a, b, c); } private void setSides(double a, double b, double c) { if (a > b + c || b > a + c || c > a + b) { System.out.println("三角形的两边之和必大于第三边"); return; } this.a = a; this.b = b; this.c = c; } }
圆形:
package com.creditharmony.adapter.testCase.test; /* * 圆形 * */ public class CircleShape extends ShapeTest { private double radius; public CircleShape(String color,double radius) { super(color); this.radius=radius; } @Override public double caperimagter() { // 周长 return 2*Math.PI*radius; } @Override public String getType() { return getColor()+ "圆形"; } public void setRadius(double radius) { this.radius = radius; } public static void main(String[] args) { ShapeTest s1=new TriangleShape("红色", 12.2, 12, 12); ShapeTest s2=new CircleShape("黄色", 5); System.out.println(s1.getType()); System.out.println(s1.caperimagter()); System.out.println(s2.getType()); System.out.println(s2.caperimagter()); } }