24、java的接口与多态

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18077275/article/details/89765150

1、接口与多态

Java除了平台无关的特点外,从语言的角度来看,Java的接口是该语言的又一特色。Java舍弃了C++语言中多重继承的机制,使得编写的代码更加健壮和便于维护,因为多继承不符合人的思维模式,就像生活中,人只有一个父亲,而不是多个。尽管多继承可以使编程者更加灵活的设计程序,但是程序会显得难于阅读和维护。
Java不支持多继承性,即一个类只能有一个父亲。单继承性使得Java简单,易于管理和维护。那么为了克服Java单继承的缺点,Java使用了接口,一个类可以实现多个接口,Java的接口更加符合人的思维方式。
2、接口的声明和使用

使用关键字interface来定义一个接口。
接口的定义和类的定义很相似,分为接口的声明和接口体。

3、接口的声明

接口通过使用关键字interface来声明,格式:
interface 接口的名字  
4、接口体

接口体中包含常量的声明(没有变量)和方法定义两个部分。接口体中只有抽象方法,没有普通方法,而且接口体中所有的常量的访问权限一定都是public(允许省略public、final修饰符),所有的抽象方法的访问权限一定都是public(允许省略public、abstract修饰符),例如:
interface Test{
   public final int MAX = 100; // 等价写法:int MAX = 100;
   public abstract void add(); // 等价写法:void add();
   public abstract float getSum(float x,float y);
}

5、接口的使用

类通过使用关键字implements声明自己实现一个或多个接口,如果实现多个接口,则用逗号隔开接口名.
class A implements Printable,Addable 
class Dog extends Animal implements Eatable,Sleepable  
如果一个类实现了某个接口,那么这个类必须重写该接口的所有方法。 
6、理解接口

接口可以增加很多类都需要具有的功能,不同的类可以实现相同的接口,同一个类也可以实现多个接口。
   接口只关心操作,并不关心操作的具体实现  
   接口的思想在于它可以增加很多类都需要具有的功能,而且实现相同的接口类不一定有继承关系。
 
7、接口回调

接口回调是指可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类重写的接口方法。

8、接口的多态性

把实现接口的类的实例的引用赋值给接口变量后,该接口变量就可以回调类重写的接口方法。
由接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口方法时就可能具有多种形态。 
9、abstract类与接口的比较

接口和abstract类的比较如下:
1).abstract类和接口都可以有abstract方法。
2).接口中只可以有常量,不能有变量;而abstract类中即可以有常量也可以有变量。
3).abstract类中也可以有非abstract方法,接口不可以。 
10、面向接口编程

面向接口去设计程序,可以通过在接口中声明若干个abstract方法,表明这些方法的重要性,方法体的内容细节由实现接口的类去完成。
使用接口进行程序设计的核心思想是使用接口回调,即接口变量存放实现该接口的类的对象的引用,从而接口变量就可以回调类实现的接口方法。 
11、示例程序

Bob.java
public class Bob implements Test{

    @Override
    public int getSum(int x) {
        return 12+x;
    }

}

Demo27 .java
public class Demo27 {

    public static void main(String[] args) {
        Test test;
        Tom tom = new Tom();
        test = tom;
        System.out.println("test的计算结果:"+test.getSum(20));
        test = new Bob();
        System.out.println("test的计算结果:"+test.getSum(20));
    }

}

Test .java
public interface Test {
    int getSum(int x);
}

Tom .java
public class Tom implements Test{

    @Override
    public int getSum(int x) {
        int sum = 0;
        
        for(int i=1;i<=x;i++){
            sum = sum+i;
        }
        
        return sum;
    }

}
 

猜你喜欢

转载自blog.csdn.net/qq_18077275/article/details/89765150