Sakura晞月

导航

关于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、包中那些已定义的接口,怎么知道那里面定义了什么方法。
  接口里定义了方法的输入输出,这些都是协议,具体的实现都在每个类中。对于很多只需要抽象接口的地方,不需要知道具体的类是什么,只要这个类实现了这个接口就可以了。

posted on 2018-11-02 08:41  Sakura晞月  阅读(277)  评论(0编辑  收藏  举报