精华内容
下载资源
问答
  • 接口引用变量调用方法
    千次阅读
    2018-04-26 14:22:48

    接口可以创建对象的引用,指向实现了该接口的类的对象。但引用变量只能调用接口本身提供的方法(在类中被重写的),例如:

    interface A{
    public abstract void read();
    void write();
    ...
    }
    Class B implement A{
    void read(){
        ...
        }
    void write(){
        ...
        }
    ...
    }
    A a=new B();
    a.write();
    a.read();
    
    更多相关内容
  • 接口引用指向实现类的对象

    千次阅读 2018-04-12 09:59:10
    经常见List<?> list= new ArrayList&...但是发现list只是ArrayList的接口不是它的父类 ,不是父类引用指向子类对象如果是应该是AbstractLIst ablist= new ArraryList(); 或者直接写为ArrayL...

    经常见List<?> list= new ArrayList<?>

               Map<?,?> map = new  HashMap<?,?>

    但是发现list只是ArrayList的接口不是它的父类 ,不是父类引用指向子类对象

    如果是应该是AbstractLIst ablist= new ArraryList();  或者直接写为ArrayList<?> list= new ArrayList<?>



    为什么要用接口引用指向实现类的对象?

    这种写法其实Java多态的表现形式(一个对象在不同环境下的不同表现形式)

    多态的定义指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

    List list;是在栈区开辟一个空间放list引用,并没有创建对象所以不知道ArrayList还是LinkedList当你list= new ArrayList(); 就创建了ArrayList对象。并且把开始创建的list引用指向这个对象ArrayList和LinkedList都是List的实现类。

    为什么一般都使用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢? 

            问题就在于List有多个实现类,如 LinkedList或者Vector等等,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类呢?这时你只要改变这一行就行了:List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。 如果没有特别需求的话,最好使用List list = new LinkedList(); ,便于程序代码的重构. 这就是面向接口编程的好处

    注意事项

    list只能使用ArrayList中已经实现了的List接口中的方法,ArrayList中那些自己的、没有在List接口定义的方法是不可以被访问到的

    list.add()其实是List接口的方法

    但是调用ArrayList的方法如 clone()方法是调用不到的


            接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。

    //定义接口InterA  
    interface InterA  
    {  
     void fun();  
    }  
    //实现接口InterA的类B  
    class B implements InterA  
    {  
     public void fun()  
     {  
      System.out.println(“This is B”);  
     }  
    }  
      
    //实现接口InterA的类C  
    class C implements InterA  
    {  
     public void fun()  
     {  
      System.out.println(“This is C”);  
     }  
    }  
      
    class Test  
    {  
     public static void main(String[] args)  
     {  
      InterA a;  
      a= new B();  
      a.fun();  
      a = new C();  
      a.fun();  
     }  
    }  

        输出结果为:
            This is B
            This is C

    上例中类B和类C是实现接口InterA的两个类,分别实现了接口的方法fun(),通过将类B和类C的实例赋给接口引用a,实现了方法在运行时的动态绑定,充分利用了“一个接口,多个方法”,展示了Java的动态多态性。

      需要注意的一点是:Java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配

    展开全文
  • 建议:通过接口引用对象。

    千次阅读 2018-07-12 16:34:08
    应该优先使用接口而不是类来引用对象。如果有适合的接口类型存在,那么对于参数、返回值、变量和域来说,就都应该使用接口类型进行声明。只有当你利用构造器创建某个对象的时候,才真正需要引用这个对象的类。 ...

            应该优先使用接口而不是类来引用对象。如果有适合的接口类型存在,那么对于参数、返回值、变量和域来说,就都应该使用接口类型进行声明。只有当你利用构造器创建某个对象的时候,才真正需要引用这个对象的类。

            如果你养成了用接口作为类型的习惯,你的程序将会更加灵活。

            有一点值得注意:如果原来的实现提供了某种特殊的功能,而这种功能并不是这个接口的通用约定所要求的,并且周围的代码又依赖于这种功能,那么很关键的一点是,新的实现也要提供同样的功能。如果依赖于实现的任何特殊属性,就要在声明变量的地方给这些需求建立相应的文档说明。

            那么,为什么要改变实现呢?因为新的实现提供了更好的性能,或者因为他提供了期望得到的额外功能。有个真实的例子与ThreadLocal类有关。

            如果没有适合的接口存在,完全可以用类而不是接口来引用对象。例如值类,比如String和BigInteger。记住,值类很少会用多个实现编写。他们通常是final的,并且很少有对应的接口。使用这种值类作为参数、变量、域或者返回类型是再合适不过了。更一般地讲,如果具体类没有相关联的接口,不管他是否表示一个值,你都没有别的选择,只有通过他的类来引用他的对象。Random类就属于这汇总情形。

            不存在适当接口类型的第二种情形是,对象属于一个框架,而框架的基本类型就是类,不是接口。如果对象属于这种基于类的框架,就应该用相关的基类(往往是抽象类)来引用这个对象,而不是用他的实现类。java.util.TimerTask抽象类就属于这种情形。

            不存在适当接口类型的最后一种情形是,类实现了接口,但是他提供了接口中不存在的额外方法——例如LinkedHashMap。如果程序依赖于这些额外的方法,这种类就应该只被用来引用他的实例。他很少应该被用作参数类型。

            以上这些例子并不全面,而只是代表了一些“适合于用类来引用对象”的情形。实际上,给定的对象是否具有适当的接口应该是很显然的。如果是,用接口引用对象就会使程序更加灵活;如果不是,则使用类层次结构中提供了必要功能的最基础的类。

    展开全文
  • Effective-Java 通过接口引用对象

    千次阅读 2020-06-28 09:47:33
    64. 通过接口引用对象 条目 51 指出,应该使用接口而不是类作为参数类型。更一般地说,你应该优先使用接口而不是类来引用对象。如果存在合适的接口类型,那么应该使用接口类型声明参数、返回值、变量和字段。 惟一...

    64. 通过接口引用对象

    条目 51 指出,应该使用接口而不是类作为参数类型。更一般地说,你应该优先使用接口而不是类来引用对象。如果存在合适的接口类型,那么应该使用接口类型声明参数、返回值、变量和字段。 惟一真正需要引用对象的类的时候是使用构造函数创建它的时候。为了具体说明这一点,考虑 LinkedHashSet 的情况,它是 Set 接口的一个实现。声明时应养成这样的习惯:

    // Good - uses interface as type
    Set<Son> sonSet = new LinkedHashSet<>();
    

    而不是这样:

    // Bad - uses class as type!
    LinkedHashSet<Son> sonSet = new LinkedHashSet<>();
    

    如果你养成了使用接口作为类型的习惯,那么你的程序将更加灵活。 如果你决定要切换实现,只需在构造函数中更改类名(或使用不同的静态工厂)。例如,第一个声明可以改为:

    Set<Son> sonSet = new HashSet<>();
    

    所有的代码都会继续工作。周围的代码不知道旧的实现类型,所以它不会在意更改。

    有一点值得注意:如果原实现提供了接口的通用约定不需要的一些特殊功能,并且代码依赖于该功能,那么新实现提供相同的功能就非常重要。例如,如果围绕第一个声明的代码依赖于 LinkedHashSet 的排序策略,那么在声明中将 HashSet 替换为 LinkedHashSet 将是不正确的,因为 HashSet 不保证迭代顺序。

    那么,为什么要更改实现类型呢?因为第二个实现比原来的实现提供了更好的性能,或者因为它提供了原来的实现所缺乏的理想功能。例如,假设一个字段包含一个 HashMap 实例。将其更改为 EnumMap 将为迭代提供更好的性能和与键的自然顺序,但是你只能在键类型为 enum 类型的情况下使用 EnumMap。将 HashMap 更改为 LinkedHashMap 将提供可预测的迭代顺序,性能与 HashMap 相当,而不需要对键类型作出任何特殊要求。

    你可能认为使用变量的实现类型声明变量是可以的,因为你可以同时更改声明类型和实现类型,但是不能保证这种更改会正确编译程序。如果客户端代码对原实现类型使用了替换时不存在的方法,或者客户端代码将实例传递给需要原实现类型的方法,那么在进行此更改之后,代码将不再编译。使用接口类型声明变量可以保持一致。

    如果没有合适的接口存在,那么用类引用对象是完全合适的。 例如,考虑值类,如 StringBigInteger。值类很少在编写时考虑到多个实现。它们通常是 final 的,很少有相应的接口。使用这样的值类作为参数、变量、字段或返回类型非常合适。

    没有合适接口类型的第二种情况是属于框架的对象,框架的基本类型是类而不是接口。如果一个对象属于这样一个基于类的框架,那么最好使用相关的基类来引用它,这通常是抽象的,而不是使用它的实现类。在 java.io 类中许多诸如 OutputStream 之类的就属于这种情况。

    没有合适接口类型的最后一种情况是,实现接口但同时提供接口中不存在的额外方法的类,例如,PriorityQueue 有一个在 Queue 接口上不存在的比较器方法。只有当程序依赖于额外的方法时,才应该使用这样的类来引用它的实例,这种情况应该非常少见。

    这三种情况并不是面面俱到的,而仅仅是为了传达适合通过类引用对象的情况。在实际应用中,给定对象是否具有适当的接口应该是显而易见的。如果是这样,如果使用接口引用对象,程序将更加灵活和流行。如果没有合适的接口,就使用类层次结构中提供所需功能的最底层的类

    展开全文
  • 我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。//定义接口InterA ...
  • 【JAVA】接口引用

    千次阅读 2018-11-09 15:38:22
    最近在学习java的过程中,遇到了一下代码。代码1: public interface Handler{ public void Hello(); } 代码2: ...代码1说明了Handler是一个接口了,既接口不能直接实例化,必须经过实现类继...
  • 【函数式接口、方法引用

    千次阅读 2018-08-27 15:55:42
    01.第一章:函数式接口_概念及格式: 1).概念:有且只有一个抽象方法的接口。(可以同时有默认方法、静态方法...) 2).格式: 修饰符(public,默认) interface 接口名{ public abstract void show(); //可以同时有...
  • Interface A = new implClassB(); Interface A = new implClassC(); 执行Interface A = new implClassB(); 方法 有没有语句判断 A是指向implClassB而不是implClassC
  • 使用接口引用指向它实现类对象

    千次阅读 2019-04-15 19:01:46
    经常看到一个现象,接口引用指向它实现类的一个对象 例如:List list = new ArrayList<String>(); 为什么要这样用,而不使用:ArrayList list = newArrayList<String>(); 这样做的好处是什么 这...
  • 不用写成你那么麻烦 直接写成Person p = new Student();...1.Java的多态性 就是多种变现形式 接口跟实现类都能完成同样的功能 2.隐藏内部代码块 人家只知道用p能调用Student的功能但是不知道你 Student类是怎么实现的
  • php接口与接口引用

    千次阅读 2011-03-16 14:49:00
    2、接口引用与规范 关键字 :implements 接口:一种成员属性全部为抽象的特殊抽象类,在程序中同为规范的作用 1、类中全部为抽象方法 2、抽象方法前不用加abstract 3、接口抽象方法属性为public 4、成员...
  • 经常使用接口 XXX = new 实现类();...为什么要用接口(List)引用指向实现类(ArrayList)的对象?便于程序代码的重构. 这就是面向接口编程的好处 List list;是在栈区开辟一个空间放list引用,并没有创建...
  • 比如:一个Result接口,他的实现类是ResultImp 会有这样的操作:Result result = new ResultImp(); 请问上面这种操作的好处是啥?请各位大神指教~
  • 接口也是一种引用类型--多态性

    千次阅读 2016-10-07 16:40:45
    我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。 //定义接口Interface...
  • 我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。 [java] view ...
  • 在实际工作中不通函数接口之间的调用以及不同文件之间函数接口的调用都很平常,但是在使用的时候会比较麻烦一些,有很多细节需要注意到
  • java调用接口的实现方法

    千次阅读 2021-03-14 10:41:26
    java调用接口的实现方法发布时间:2020-06-29 11:08:46来源:亿速云阅读:78作者:Leah本篇文章给大家分享的是有关java调用接口的实现方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以...
  • 我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。 /定义接口InterA inte
  • 本质其实就是实例化对象后赋值给接口的引用,在其他类要调用接口时,他不需要考虑实现类,直接和接口打交道,就是通过A d=new a(),但是对象都是由spring实例化,所以spring注入,就是将实例化对象给接口引用,...
  • go语言中给接口赋值的时候,对象如果是值(对于引用的接受者处理不了) 如果是指针,则可以自动实现值的处理 */ package main import "fmt" //定义Integer类型 type Integer int type LessAddInf interface{ ...
  • postman引入文件批量调用接口

    千次阅读 2022-01-18 09:42:44
    同一个接口,传入不同参数,多次调用,操作如下 1、在collections菜单点击加号创建分组 2、添加新的接口请求 接口请求参数格式如下: 3、引入excel文件,先创建一个新的excel文件,配置对应的参数和参数值,参数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,128,255
精华内容 451,302
关键字:

接口的引用