我们在编写类时,常常需要为它定义一些方法,这些方法主要用来描述该类的行为方式,因此,这些方法都有具体
的方法体。但在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确的知道这些子类如何实现
这些方法。对于以上的问题有何解法呢?使用抽象方法就可以满足这些要求:抽象方法是只有方法签名,没有方法
实现的方法。
抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象
方法,对于抽象方法和抽象类的规则如下:
1、抽象类必须使用abstract修饰符类修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。
2、抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例,即使这个抽象类中没有抽
象方法,也是不能创建实例。
3、抽象类可以包含Field、普通方法和抽象方法、构造器、初始化块、内部类、枚举类6种成分。抽象类的构造器不
能用于创建实例,主要是用于被其子类调用。
4、含有抽象方法的类只能被定义成抽象类。
定义抽象方法只需在普通方法上加上abstract修饰符,并把普通方法的方法体后的花括号全部去掉。并在方法后增
加分号。
下面定义一个抽象类:
public abstract class Shape { public Shape(){ } public abstract double calPerimeter(); public abstract String getType(); }
抽象方法是用来计算周长,而getType抽象方法是获取这个形状的类型。
接着我们定义一个三角形的类,继承这个抽象类,实现抽象类中的所有的抽象方法:
public class Triangle extends Shape { private double a; private double b; private double c; public Triangle(double a,double b,double c) { this.setSides(a, b, c); } @Override public double calPerimeter() { return a+b+c; } @Override public String getType() { return "三角形"; } 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; } }以上类继承了Shape抽象类,并且实现了抽象类中的两个抽象方法。接着定义我们的执行入口:
public class MainTest { public static void main(String[] args) { Shape shape=new Triangle(2, 2, 3); System.out.println(shape.calPerimeter()); System.out.println(shape.getType()); } }
7.0
三角形
从上面的程序中可以看出,抽象类不能创建实例,只能当成父类来被继承。从语义的角度来看,抽象类是从多个具
体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作
为其子类的模板,避免了子类设计的随意性。
如果编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留在子类实现,这就是一种模板模
式,模板模式是一种十分常见的设计模式之一,上面的Shape程序其实就已经用到了模板模式。
以下是另一种模板模式的范例:
public abstract class Shape { public Shape() { } public abstract double calPerimeter(); public double getCalPerimeter(){ return calPerimeter(); } }以上定义了一个抽象类,在这个抽象类中定义了一个普通方法,用于计算周长,但这个普通方法是依赖于一个抽
象,并且这个抽象方法推迟到子类中实现。
public class Triangle extends Shape { private double a; private double b; private double 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; } public Triangle(double a, double b, double c) { this.setSides(a, b, c); } @Override public double calPerimeter() { return a + b + c; } }
public class MainTest { public static void main(String[] args) { Shape shape=new Triangle(2, 2, 3); System.out.println(shape.calPerimeter()); } }
7.0
使用模板模式规则如下:
1、抽象父类可以只定义需要使用的某些方法,把不能实现的部分抽象成抽象方法,留给子类去实现。
2、父类中可能包含需要调用其他系列方法的方法,这些被调方法既可以由父类实现,也可以由其子类实现。父类
里提供的方法只是定义了一个通用算法,其实现也许并不完全由自身实现,而必须依赖于其父类的辅助。
转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/43877437
情绪控_
原文地址:http://blog.csdn.net/hai_qing_xu_kong/article/details/43877437