zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    php 请求另一个服务器接口返回数据
    yii2 安装
    无限分类的
    程序员学习能力提升三要素转载
    为什么有的人工作多年还是老样子
    随笔杂谈
    Ecshop商品描述上传中文名图片无法显示解决方法
    「PSR 规范」PSR-2 编码风格规范
    leetcode 之Set Matrix Zeroes(10)
    leetcode 之Plus One(9)
  • 原文地址:https://www.cnblogs.com/pangpanghuan/p/5560717.html
Copyright © 2011-2022 走看看