java Interface应该是为了实现多继承而添加的,提到Interface,那就不得不说abstract class,的确abstract class和Interface有很多地方很相似,例如都是抽象,都不能实例化,implements或者extends需要实现里面全部的abstract函数。但是他们的区别也很多。
区别:
1 Interface中的函数默认属性是public和abstract(无论是否在code中明确写出来),函数不能有body;而abstract class的默认属性应该是protected的,如果属性不是abstract,那就需要body或者是abstract属性。
2 Interface可以implements多个,而abstract只能extends一个。
3 abstract class还是class,从编译后的class文件中,仍然能够看到默认的构造函数,而interface没有。
4 Interface中的成员变量默认是public static final的,也就是常量,所以不能定义可变量,但是abstract class除了定义常量还可以定义可变量。如果能够选用interface,就最好用interface。另外如果文件中大量使用常量,并且不同文件中会使用同一个,那么可以将使用到的所有常量定义在一个interface里面,不需要定义函数,也不要使用一段时间后定义函数,之后各个使用的类直接implements interface就可以了,或者import interface也可以。
例如:
public interface IColor {
public static final int RED = 0;
public static final int BLUE = 1;
public static final int GREEN = 2;
}
public class Cloth implements IColor {
protected int computePrice(int color) {
if (color == RED) {
return 100;
} else {
return 50;
}
}
}
当然也可以用import interface的方式了,这样就无论interface中是否有定义函数,都可以使用里面的常量。
例如:
public interface IColor {
public static final int RED = 0;
public static final int BLUE = 1;
public static final int GREEN = 2;
void setColor();
}
import Icolor;
public class Cloth {
//这里如果写成public class Cloth implements IColor ,那么就必须实现setColor
protected int computePrice(int color) {
if (color == IColor.RED) {
return 100;
} else {
return 50;
}
}
}
interface还可以嵌入到类里面,将常量根据类别进行分组,使得对外使用这些常量更好的组织在一起。
例如
public class Car {
int mClor;
int mSize;
public interface Size {
public static final int BIG = 0;
public static fianl int SMALL = 1;
}
public interface SkinColor {
public static final int RED = 0;
public static final int BLUE = 1;
}
public int setColor (int color) {
mClor = color;
}
public int setSize (int size) {
mSize = size;
}
}
import Car;
public class CarShop {
Car newCar = new Car();
newCar.setColor(Car.SkinColor.RED); // 这里不能写成newCar.setColor(newCar.SkinColor.RED)
newCar.setColor(Car.Size.BIG);
}
当然用interface当enum使用,不如enum安全了,例如setColor的参数是int,除非setColor里面判断传入参数的有效性。
例如
public void setColor (int color) {
if (color < RED || color > BLUE) {
return -1;
}
mClor = color;
return mClor;
}
既然提到了enum,我们就研究一下,Java enum的功能比较强大,使用也比较方便。
package son;
public enum TestEnum {
ALWAYS_USE,
ASK_EVERY_TIME,
NEVER_USE;
public void set(TestEnum value) {
System.out.println(value);
}
}
import son.TestEnum;
public class Test {
public TestEnum returnEnumValue