Java接口与多态

接口

可以理解为一种特殊的类,里面全部是由全局常量(static final)和公共的抽象方法所组成

接口的定义格式

接口的数据成员,只允许被public, static, final修饰。 接口的方法成员,只允许被public, abstract修饰。

Interface 接口名称{  

  private static final int var1=1;  //error

  public static final int var2 = 2;

  public abstract void fun1();

  private abstract int fun2();    //error.

}  

接口中的数据成员都为static final类型,必须进行初始化,且接口的数据成员的值不能被修改,允许省略static, final关键字。 接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字

public interface A{     

  int num;    //error. 没初始化     

  String name = “test”;     

  public void getName( ) {……}  //error.不允许定义方法体

}  

接口的实现 接口不能用new运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象 与抽象类一样,接口要使用也必须通过子类,子类通过implements关键字实现接口。 实现格式: class 子类名称 implements 接口A, 接口B,….{ //子类成员声明 } 接口的使用必须通过子类,子类必须覆写全部抽象方法。一个子类虽然只能继承于一个父类,但可以同时实现多个接口。

interface A{      

public String name = “小明”;

      public void print();

      public String getName();

}

interface B{      

  public void setName();

}

class C implements A, B{   

  public void print( ) { ……};

  public  String getName( ) {……};

  public  void setName( ) {……};

}  

必须实现接口中的所有方法,否则,实现接口的类将带有抽象方法,因此成为抽象类。 在覆写来自接口的方法时,必须声明成public。

class C implements A, B{   

  //public void print( ) { ……};     //没覆写print方法,编译不过。

  public  String getName( ) {……};

  public  void setName( ) {……};

}  

对象转型

对象可以被转型为其所属类实现的接口类型。 接口不可通过new实例化,但可以声明接口变量。

public class Test implements A{

  intidx = 1;

  public void print(){

    System.out.println(“”)

  }

  public String getName(){       }

      public static void main(String []agrs){

    Test test = new Test();

        A a = (A)test;   //对象转型为接口类型

        System.out.println(a.name);    //输出name的值

        a.idx = 2;   //error. idx属于test,在接口A中不存在

        a.print();     //执行Test的print方法。

  }

}

 

继承抽象类实现接口

一个子类可以同时继承抽象类和实现接口 格式如下: class 子类 extends 抽象类 implements 接口A,接口B,……{  }  

接口的继承

接口不能继承一个抽象类,却可以通过extends同时继承于多个接口。

public abstract class base {……}

interface B {……} 

interface C{……} i

nterface A extends base{……}    //错误

interface A extends B, C{ ……}    //正确  

接口与继承的区别

No.  

区别  

抽象类  

接口  

1.定义:

以abstract声明,抽象方法可有可无。

以interface声明,由静态常量和抽象方法组成。  

2.组成:

构造方法、抽象方法、普通方法、常量、变量。 

静态常量、抽象方法。

3.使用:

子类继承抽象类(extends)。

子类实现接口(implements)。

4.关系:

抽象类可以实现多个接口。

接口不能继承抽象类,但允许继承多个接口。

5.对象:

都通过对象的多态性产生实例化对象。

6.局限:

抽象类有单继承的局限。

接口可以实现多重继承。

7.选择:

如果抽象类和接口都可以使用的话,优先使用接口,可以避免单继承的局限。

 

多态

是指不同类型的对象可以响应相同的消息,从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的 ◦

例如

所有的Object类的对象都响应toString()方法

多态性在java中主要有以下两种体现:

方法的重载与覆写。

对象的多态性。

 

对象的多态性

对象的多态性主要分为以下两种类型:

1.向上转型:子类对象->父类对象

对于向上转型,程序会自动完成。

//BaseClass为父类,DerivedClass为BaseClass的派生类

BaseClass bc = new DerivedClass();   //隐式转型。

2.向下转型:父类对象->子类对象

对于向下转型,必须明确指明要转型的子类类型。

BaseClass bc = new DerivedClass();   //先向上转型

DerivedClass dc = (DerivedClass)bc;  

 

public class A{

  String name = “A”;

  public void fun1(){

    System.out.println(“A->fun1”);

    }

  public void fun2(){

    System.out.println(“A->fun2”);

  }

}

public class B extends A{

    String name = “B”;

    public void fun1(){

        System.out.println(“B->fun1”);

    }

    public void fun3(){

        System.out.println(“B->fun3”);

    }

}

向上转型:

public class Demo{

     public static void main(String args[]){

          A a = new B( );

          a.fun1();     //输出什么?  B->fun1

          a.fun2();     //输出什么?  A->fun2

          a.fun3();     //error. A中没定义fun3方法

          System.out.println(a.name);   //输出什么?

     }

 }

 

向下转型

public class Demo{

     public static void main(String args[]){

          //B b = (B)new A( );   //强制转型,运行后抛出异常

          A a = new B();

          B b = (B)a;   //向下转型

          b.fun1();     //输出什么? A->fun1

          b.fun2();     //输出什么? A->fun2

          b.fun3();     //输出什么? B->fun3

     }

 }

要想产生对象的向下转型,则必须先产生一个向上的转型关系, A a = new B(); 表示建立关系。  

多态的目的

所有的对象都可被转型为相同的类型,响应相同的消息 使代码变得简单且容易理解 使程序具有很好的“扩展性”  

应用实例

技术基础 ◦向上转型:一个父类的引用变量可以指向不同的子类对象。 ◦动态绑定:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。 例子1:司机开车 public abstract class Driver{

  public Driver( ) { }

  public abstract void drives( );

}

public class FemaleDriver extends Driver {

  public FemaleDriver( ) { }

  public void drives( ) {

       System.out.println("A Female driver drives a vehicle.");

   }

}

public class MaleDriver extends Driver {

  public MaleDriver( ) { }

  public void drives( ) {

       System.out.println("A Male driver drives a vehicle.");

    }

}

 

public class Test{

  public static void main(String [ ] args){

      Driver a = new FemaleDriver( );

      Driver b = new MaleDriver( );

      a.drives( );

      b.drives( );

  }

 }

输出结果:A Female driver drives a vehicle.

                A Male driver drives a vehicle.

 

例子2——司机开什么车 不利用对象多态性的做法

public class MaleDriver extends Driver {

  public MaleDriver( ) { }

  public void drivesBus( ) {

       System.out.println("A Male driver drives a bus.");

   }

   public void drivesCar( ){

      System.out.println("A Male driver drives a car.");      

   }

   public void drivesTruck( ){

       System.out.println("A Male driver drives a truck.");

   }

   ……  

}

 

利用对象多态性的做法

public abstract class Vehicle{   

  public void drivedByFemale( );   

  public void drivedByMale();

}

public class Bus extends Vehicle{   

  public void drivedByFemale( ){       

    System.out.println("A Female driver drives a bus.");   

  }   

  public void drivedByMale(){        

    System.out.println("A Male driver drives a bus.");   

  }

}  

public class MaleDriver extends Driver {    

  public void drives(Vehicle  v){        

    v. drivedByMale();    

  }

}

public class Test{     

  public static void main(){         

    Vehicle bus = new Bus();          

    Driver male = new MaleDriver();          

    male.drives(bus);     

  }

}

输出结果: A Male driver drives a bus

posted @ 2016-06-05 14:21  太潮了就要晒  阅读(502)  评论(0编辑  收藏  举报