关于Java的接口
其实刚开始听到接口的时候不解其意,为什么要有接口这个东西,加之老师上课我可能没仔细听(或者时间长了忘了?),这次看到了“用接口设计并实现圆,三角形,矩形的面积与周长计算”这个题目的代码,它将接口定义在了源代码最首的部分,并且是定义成了抽象类。
interface Shape{ public abstract double getArea(); public abstract double getCircumference(); }
接下来是全部的代码(来源于百度):
package javaapplication3; import java.util.Scanner; interface Shape{ public abstract double getArea(); public abstract double getCircumference(); } class Circle implements Shape { private double r=0; public Circle(double r) { this.r=r;} public double getR(){ return this.r; } public double getArea() { return (3.14*this.r*this.r);} public double getCircumference(){ return 2*3.14*this.r; } } class Triangle implements Shape { private double a=0; private double b=0; private double c=0; public Triangle(double a, double b, double c) { this.a=a; this.b=b; this.c=c;} public double getA() { return this.a;} public double getB() { return this.b;} public double getC() { return this.c;} public double getArea() { // 根据海伦公式求三角形的面积 double p=(a+b+c)/2; return Math.pow(p*(p-a)*(p-b)*(p-c),0.5);} public double getCircumference(){ return this.a+this.b+this.c; } } class Rentangle implements Shape{ public double height=0; public double width=0; public Rentangle(double height, double width){ this.height = height; this.width = width;} public double getHeight(){ return this.height; } public double getWidth(){ return this.width;} public double getArea(){ return this.height*this.width; } public double getCircumference(){ return 2*(this.height+this.width); } } public class testshape { public static void main(String[] args){ Scanner input = new Scanner(System.in); double r=0; double a=0; double b=0; double c=0; double height=0; double width=0; do{ System.out.println("请输入圆的半径r:"); r= input.nextDouble(); if (r<=0) { System.out.print("输入错误!!!"); } }while (r<=0); do { System.out.println("请输入三角形的三条边a、b、c:"); a= input.nextDouble(); b= input.nextDouble(); c= input.nextDouble(); if (a<0||b<0||c<0||a+b<=c||a-b>=c) { System.out.print("输入错误!!!"); } } while ((a<0||b<0||c<0||a+b<=c||a-b>=c)); do { System.out.println("请输入矩形的长和宽height、width:"); height= input.nextDouble(); width= input.nextDouble(); if (height<=0||width<=0) { System.out.print("输入错误!!!"); } } while (height<=0||width<=0); Circle C=new Circle(r); Triangle T=new Triangle(a,b,c); Rentangle R=new Rentangle(height,width); System.out.println("******圆*******"); System.out.println("半径: " + C.getR()); System.out.println("面积 : " + C.getArea()); System.out.println("周长 : " + C.getCircumference()); System.out.println("*******三角形*******"); System.out.println("三边为: " + T.getA()+","+T.getB()+","+T.getC()); System.out.println("面积 : " + T.getArea()); System.out.println("周长 : " + T.getCircumference()); System.out.println("*******矩形*******"); System.out.println("长: " + R.getHeight()); System.out.println("宽: " + R.getWidth()); System.out.println("面积 : " + R.getArea()); System.out.println("周长 : " + R.getCircumference()); } }
java的接口的用处主要体现在下面几个方面:
(1)通过接口可以实现不相关类的相同行为,而不需要了解对象所对应的类。
(2)通过接口可以指明多个类需要实现的方法。
(3)通过接口可以了解对象的交互界面,而不需了解对象所对应的类。
类描述了一个实体,包括实体的状态,也包括实体可能发出的动作。
接口定义了一个实体可能发出的动作。但是只是定义了这些动作的原型,没有实现,也没有任何状态信息。
所以接口有点象一个规范、一个协议,是一个抽象的概念;而类则是实现了这个协议,满足了这个规范的具体实体,是一个具体的概念。
从程序角度,简单理解,接口就是函数更新,类就是函数实现。需要注意的是同一个声明可能有很多种实现。
1、接口中定义类方法的原型,但是不能说是空方法,因为空方法的意思是有实现体,只不过实现体是空操作。实际上接口没有定义任何实现体。具体的实现体都是在实现接口的类中,接口只是定义了这些方法的调用方式。
你当然也可以不用接口,直接在类里面写方法,但是如果你的一组方法需要在很多类里实现,那么把它们抽象出来,做成一个接口规范,不是更好么?
2、一个类描述了一个实体,这个实体可能是一个复杂的对象,它的动作很多,如果把这些动作分类,用接口a定义其中的某一组动作,接口b定义其中的另外一组动作,这样的结构,比较清楚。
这种方式具备了多继承的优点,避免了多继承的缺陷。实际上在历史上,接口在很大程度上,是为了解决多继承带来的种种问题而设计出来的。
3、包中那些已定义的接口,怎么知道那里面定义了什么方法。
接口里定义了方法的输入输出,这些都是协议,具体的实现都在每个类中。对于很多只需要抽象接口的地方,不需要知道具体的类是什么,只要这个类实现了这个接口就可以了。