Java核心技术之深入理解抽象类和接口

1 总体说明

抽象类 模板方法模式 接口

2 抽象类

抽象类是不能被实例化的类,一般设计成被子类继承,实现父类的抽象方法。 和普通类最大的不同就是不能实例化,可以声明抽象方法,让子类实现。 可以定义成员变量和普通方法

package tony.javacore.oop.abstractclass;import static tony.javacore.util.io.PrintUtils.println;/** * <p>抽象父类Shape</p> * @author tony 18616939520@163.com * @project_name JavaCore * @package_name tony.javacore.oop.abstractclass * @file_name Shape.java * @see * @version 2015年8月30日下午10:20:19 * @since JDK8.0u45 */{String getColor() {return color;}(String color) {this.color = color;}(){println(“Execute Shape Constructor Method”);}(String color){println(“Execute Shape Constructor Method :Color is “+color);this.color=color;}/*** 定义抽象计算周长的方法* @return* @version 2015年8月30日下午10:21:10* @since*/();/*** 返回图形形状的抽象方法* @return* @version 2015年8月30日下午10:22:53* @since*/public abstract String getType();}

子类继承抽象类时,必须实现抽象父类的抽象方法

package tony.javacore.oop.abstractclass;/** * * <p>定义子类圆形</p> * @author tony 18616939520@163.com * @project_name JavaCore * @package_name tony.javacore.oop.abstractclass * @file_name Circle.java * @see * @version 2015年8月30日下午10:25:35 * @since JDK8.0u45 */{() {return radius;}(double radius) {this.radius = radius;}/*** 子类Circle构造器* @param color* @param radius*/public Circle(String color,double radius) {super(color);this.radius=radius;}() {return 2*Math.PI*radius; //圆的周长为2r}@Overridepublic String getType() {return getColor()+” 圆形”;}@Overridepublic String toString() {return “Circle [radius=” + radius + “]”;}}

子类可以拥有自己独特的属性,方法

package tony.javacore.oop.abstractclass;import static tony.javacore.util.io.PrintUtils.println;/** * <p>三角形</p> * @author tony 18616939520@163.com * @project_name JavaCore * @package_name tony.javacore.oop.abstractclass * @file_name Triangle.java * @see * @version 2015年8月30日下午10:28:35 * @since JDK8.0u45 */{one;private double two;private double three;public Triangle(String color, double one, double two, double three) {super(color);setSides(one, two, three);}/*** 创建三角形对象的三条边* @param one* @param two* @param three* @version 2015年8月30日下午10:33:22* @since*/(double one, double two, double three){if(one>=two+three||two>one+three||three>one+two){println(“两边之和必须大于第三边长”);return;}this.one=one;this.two=two;this.three=three;}() {return one+two+three;}@Overridepublic String getType() {return super.getColor()+” 三角形”;}@Overridepublic String toString() {return “Triangle [one=” + one + “, two=” + two + “, three=” + three + “]”;}}

当父类的引用(Shape shape)指向子类的对象(Circle)时,多态就发生了。 此时如果使用父类的引用调用父类中定义的方法,运行时实际上是调用子类的方法,父类的同名方法被覆盖了。

package tony.javacore.oop.abstractclass;import static tony.javacore.util.io.PrintUtils.println;/** * <p>抽象类测试用例</p> * @author tony 18616939520@163.com * @project_name JavaCore * @package_name tony.javacore.oop.abstractclass * @file_name ShapeHandler.java * @see * @version 2015年8月30日下午10:35:11 * @since JDK8.0u45 */{(String[] args) {Shape circle =new Circle(“红色 “, 2.2);Shape triangle=new Triangle(“绿色 “, 3.0, 4.0, 5.0);println(“圆形的周长为 : “+circle.calPerimeter());println(“三角形的周长为 : “+triangle.calPerimeter());println(circle.getType());}}3 模板方法模式如果说,罗马是一座厚重和凝固的堡垒,

Java核心技术之深入理解抽象类和接口

相关文章:

你感兴趣的文章:

标签云: