一个例子,黄金可以做金属的一个子类,而黄金也可以做货币的一个子类。而货币和金属之间却没有必然的联系。以前只是提到过,类之间实现的是单继承的关系。但是遇到黄金既是金属的子类又是货币的之类的这种情况该如何去姐姐呢?这是需要引入interface接口。
接口用于解决多重继承。
接口可以看成是一种特殊的抽象类,这也就意味着接口不是类。
接口和抽象类的区别在于:
1)接口用于实现多重继承,而抽象类是类,只能是单继承。
2)接口使用关键字interface,而抽象类是类,使用关键字class。
3)接口内部无构造,抽象类有构造。
4)接口中所有的属性都是public static final的,即常量。即使不写那三个关键值,也默认是这样的。
5)接口中所有的方法都是pulicd的抽象方法,而抽象类当中的方法不一定 都是抽象的。
接口中的一些用法。
抽象类的引用与接口的引用的用法是相同的。
抽象类中的方法与接口中的方法都使用了子类重写的方法。
把接口当作抽象类来用在大多数情况下是可以的。
给出类和类以及类和接口直接的写法上的区别:
上图表面类与类直接是单继承的,类与接口之间是多继承的,而接口与接口直接也是多继承的,多个接口直接在写代码的时候要用逗号隔开,其关键字上面写的也很清楚了。
接口不能给类(接口当中不能够出现已经实现了的方法)。
接口中没有构造,接口中的方法都是public的抽象的方法。一个类实现一个接口。接口中的属性可以用 类名. 这种方式来调用,这也就告诉我们接口中的属性是static的。接口中的方法即使不用public来修饰,其默认也是public的,因为在子类中重写该方法的时候必须加上public关键字。接口当中主要有抽象的方法组成。
public interface Money {
void buye();
}
public interface Metal{
void shine();
}
public class Gold implements Money,Metal {
public void buy(){}
public void shine(){}
public static void main(String[] args){
}
}
接口定义了一种规范。我们可以借助这种规范来是得很困难的事情变得简单。
package day09.tarena.com;
public interface MyIn1 {
int a = 3;
void test();
//public MyIn1(){} //接口没有构造
}
package day09.tarena.com;
public class MyClass implements MyIn1 {//证明test()方法是抽象方法
public void test(){} //证明接口中的方法是public的
public static void main(String[] args) {
System.out.println(MyClass.a); //类名点出来 证明是static的
}
}
实现接口的代码,用这个代码可以验证上面提到的一些接口特性。
package day09.tarena.com;
public class Gold implements Money,Metal{
public void buy(){
System.out.println("money");
} //重写接口中的方法
public void shine(){
System.out.println("metal");
} //重写接口中的方法
public static void main(String[] args){
/*Gold s = new Gold();
s.buy();
s.shine();*/ // 这种写法与接口无关
Metal m1 = new Gold(); //多态发生了
m1.shine();
Money m2 = new Gold(); //多态发生
m2.buy();
}
}
package day09.tarena.com;
//定义接口相当于定义了一套规范,灵活子类的行为。
public interface Money {
void buy();
}
package day09.tarena.com;
public interface Metal {
void shine();
}
接口的一些好处:定义接口相当于定义了一套规范,灵活子类的行为。上面还证明了,在发生多态的时候,接口可以当作抽象类来用。