1、关键字:interface
interface Printable{
public static final int MAX=100; //等价 int MAX=100;
public abstract void add(); //等价 void add();
public abstract int sum(int a,int b);
}
接口体中包含常量和抽象方法。常量的访问权限一定是public,而且是static常量(允许省略public、static、final),抽象方法的访问权限也一定是public(允许省略public abstract)
2、接口实现
关键字:implements
如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法,并且重写后的方法必须加上public修饰,否则降低了访问权限。如果一个抽象类实现了某个接口,那么这个类可以重写接口中的方法,也可以直接拥有接口的方法。
public interface Computable {
int MAX=100;
int f(int a);
}
public class China implements Computable{
int number;
public int f(int a){
int sum=0;
for(int i=0;i<=a;i++){
sum=sum+i;
}
return sum;
}
}
public class Japan implements Computable {
int number;
public int f(int a){
return a+MAX;
}
}
public class example1 {
public static void main(String[] args) {
China zhang=new China();
Japan liu=new Japan();
zhang.number=12+Computable.MAX;
liu.number=13+Computable.MAX;
System.out.println("zhang的学号"+zhang.number+",zhang的求和结果:"+zhang.f(100));
System.out.println("liu的学号"+liu.number+",liu的求和结果:"+liu.f(100));
}
}
zhang的学号112,zhang的求和结果:5050
liu的学号113,liu的求和结果:200
3、接口回调
接口回调类似于继承中所讲的上转型对象调用子类重写的方法。
interface ShowMessage{
void 显示商标(String s);
}
class TV implements ShowMessage{
public void 显示商标(String s){
System.out.println(s);
}
}
class PC implements ShowMessage{
public void 显示商标(String s){
System.out.println(s);
}
}
public class Example2 {
public static void main(String[] args) {
ShowMessage name;
name=new TV();
name.显示商标("长城牌电视机");
name=new PC();
name.显示商标("华为PC");
}
}
长城牌电视机
华为PC
4、接口与多态
不同的类在实现同一个接口时可能具有不同的实现方法,那么接口变量在回调接口方法时就可能具有多种形态。
interface CompurerAverage{
double getAverage(double a,double b);
}
class A implements CompurerAverage{
public double getAverage(double a,double b){
double aver =(a+b)/2;
return aver;
}
}
class B implements CompurerAverage{
public double getAverage(double a,double b){
double aver=Math.sqrt(a*b);
return aver;
}
}
public class example4 {
public static void main(String[] args) {
CompurerAverage Computer;
Computer=new A();
double a=2;
double b=3;
double result= Computer.getAverage(a, b);
System.out.printf("%5.2f和%5.2f的算数平均值:%5.2f\n",a,b,result);//小数点后的数字表示保留小数点位数
Computer=new B();
result=Computer.getAverage(a, b);
System.out.printf("%5.2f和%5.2f的几何平均值:%5.2f\n",a,b,result);
}
}
2.00和 3.00的算数平均值: 2.50
2.00和 3.00的几何平均值: 2.45
5、接口参数
如果一个方法的参数是接口类型,我们就可以将任意实现该接口的类的实例的引用传递给该接口类型,那么接口参数就可以回调实现的接口方法。
interface SpeakHello{
void speakHello();
}
class ChineseSpeak implements SpeakHello{
public void speakHello(){
System.out.println("中国人习惯问候语:你好,吃饭了吗?");
}
}
class KindHello{
void kindSpeak(SpeakHello hello){
hello.speakHello();
}
}
public class example5 {
public static void main(String[] args) {
KindHello kindhello=new KindHello();
kindhello.kindSpeak(new ChineseSpeak());
}
}
6、abstract类与接口的比较
接口中只能有常量和abstract方法,如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑用接口。
abstract类中可以有常量也可以有变量,既可以有abstract方法也可以有非abstract方法,如果一个问题除了需要重写父类的abstract类也需要继承父类的一些变量和非abstract方法时,可以考虑用abstract类。