1,接口的本质
接口本身就是一钟完全抽象类,也就是说,里面的方法全部都是抽象方法,里面的变量全是常量
2,接口的定义
接口也是一个类,不过使用interface来进行声明,里面的方法与抽象方法一样,没有方法体
public interface Area {
public abstract double area(); //可以省略:public abstract
double perimeter();//Java会自动帮我们加:public abstract
//int x=5;
//public static final int MAX=5;
public static final int MAX=5;
public static final double PI=3.14;
}
3,接口的使用
1)接口本身是不能new对象的,只能当作引用来用,引用的实例为实现类对象
2)一个类要实现接口,必须把接口中所有的抽象方法全部实现,否则就要声明成抽象类。 实现类我们有时也把它称为子类。
3)接口本身上是类,它继承自Object,因此通过接口引用可以访问Object中的所有方法
public class Rectangle implements Area{
private int width;
private int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public Rectangle() {
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
//实现接口中的抽象方法
public double area(){
return width*height;
}
@Override
public double perimeter() {
return (width+height)*2;
}
@Override
public String toString() {
aa();
return "一个矩形:"+width + ", " + height;
}
public void aa(){
//x++;
//MAX++;//WA:接口中的变量全是public static final的,不能重新赋值
//MAX=10; //WA
System.out.println("MAX=" + MAX);
}
}
public class Circle implements Area {
private int r;
public Circle(int r) {
this.r = r;
}
public Circle() {
super();
}
@Override
public double area() {
return PI*r*r;
}
@Override
public double perimeter() {
return 2*PI*r;
}
@Override
public String toString() {
return "圆,半径:" + r;
}
}
public class Rectangle implements Area{
private int width;
private int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public Rectangle() {
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
//实现接口中的抽象方法
public double area(){
return width*height;
}
@Override
public double perimeter() {
return (width+height)*2;
}
@Override
public String toString() {
aa();
return "一个矩形:"+width + ", " + height;
}
public void aa(){
//x++;
//MAX++;//WA:接口中的变量全是public static final的,不能重新赋值
//MAX=10; //WA
System.out.println("MAX=" + MAX);
}
}
4,单继承,多实现
为了避免C++中 的钻石问题(大概就是一个类可以继承多个类,从而导致使用多态的时候对象需要随机调用父类方法),java放弃了多继承,而是使用单继承多实现的方式。
单继承:也就是一个类只能继承一个类(但可以一个类可以被多个类继承)
多继承:一个类可以实现多个接口,但是每一个接口的方法都需要实现,不然只能声明为抽象类,抽象方法
public class Globe implements Area,Volume {
private int r;
public Globe(int r) {
this.r = r;
}
public Globe() {
super();
}
@Override
public double volume() {
return PI*4/3*r*r*r;
}
@Override
public double area() {
return 4*PI*r*r;
}
@Override
public String toString() {
return "一个球,面积:"+area()+",体积:"+volume();
}
}
5,接口的多继承
一个接口可以继承多个接口,里面并不实现任何方法,唯一的作用就是整合接口,方便使用,在实现这个接口的时候,需要实现它的所有方法,同时它也可以解决一些多态问题。但是在实际开发当中,我们并不建议使用这种方式,而是使用专一的接口,因为这会破坏数据的封装性,大家都是专一的人,何必呢
//把两个父接口中的抽象方法全部继承过来了---综合接口
public interface AreaVolume extends Area,Volume {
}
public interface Area {
public abstract double area();
public static final double PI=3.14;
}
public interface Volume {
public abstract double volume();
}
6,值得注意的一点
因为接口中的public是可以省略的,所以在实现它的方法的时候,就需要注意权限问题了,子类的权限是不能低于父类的,但是我们通常充分使用myeclipse,就不会出现问题
7,为什么需要接口?
讲了那么多,到底java何解需要接口呢
1)接口具有封装隔离功能。
2)系统灵活性增强,当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉
3)约束,要实现它,就必须实现它的全部方法