精华内容
下载资源
问答
  • E:\最全面的Java接口自动化测试实战\第12章 MyBatis+MySQL实现用例管理 E:\最全面的Java接口自动化测试实战\第13章 TestNg+MyBatis实现数据校验 E:\最全面的Java接口自动化测试实战\第14章 持续集成 E:\最全面的Java...
  • 一款java接口文档自动生成的插件,包含了根据接口注释或注解自动生成接口文档,可网页打开,使用spring+vue开发,告别传统手写接口文档,告别swagger臃肿视图和阉割功能,提供了生成、管理及使用等全方位功能。...
  • 大多数人认为接口的意义在于顶替多重继承众所周知Java没有c++那样多重继承的机制但是却能够实作多个接口其实这样做是很牵强的接口和继承是完全不同的东西接口没有能力代替多重继承也没有这个义务接口的作用...
  • Java接口

    千次阅读 多人点赞 2018-12-24 12:00:36
    Java接口也表示IS-A关系。它不能像抽象类一样被实例化。 q) Java为什么需要接口 通过接口实现多继承 用于实现耦合 如下图所示,一个类扩展了另一个类,一个接口扩展了另一个接口,一个类实现了一个接口。 接...


    java中的接口是类的蓝图。 它有静态常量和抽象方法。java中的接口是一种实现抽象的机制。 接口中只有抽象方法而不是方法体。接口用于在Java中实现抽象和多重继承。Java接口也表示IS-A关系。它不能像抽象类一样被实例化。

    q) Java为什么需要接口

    • 通过接口实现多继承
    • 用于实现耦合
      如下图所示,一个类扩展了另一个类,一个接口扩展了另一个接口,一个类实现了一个接口。
      在这里插入图片描述

    接口的用法

    interface Printer{                                                                //打印机的接口
    	void print();                                                        //打印机的打印方法
    }
    

    电脑来了

    class  Computer implements Printer{                                           //computer连接了Printer的方法
    	@override
    	public void print(){
    		System.out.println("我是电脑");                                        //把msg的方法打印出来
    	}
    }
    

    手机来了

    class SmartPhone implements Printer{                                   //手机连接了打印机
    	@override
    	public void print(){
    		System.out.println("我是智能手机");                           //手机的println()方法
    	}
    }
    

    Java 8接口特性

    Java 8以前的接口只能有抽象方法,不能有方法体
    Java 8开始可以有方法体,但是只能是默认的方法体和静态方法

    Q)为什么要加这两个特性呢?
    A)简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。我们只需在方法名前面加个default关键字即可实现默认方法。该策略可以解决多继承的问题。

    default方法可以解决兼容性问题和简单的解决多继承问题

    Java8之前
    HeadFirst Java 时,作者说,为了解决多重继承所引起的“致命方块问题”
    在这里插入图片描述
    所以Java不用多重继承,用多重实现,但是在多重实现中,这个问题解决了吗?还没有

    interface CanonPrinter{
    	void print();
    }
    
    interface DeliPrinter{
    	void ptint();
    }
    

    有一个类两个接口都支持,但是当答打印的时候

    class Computer implementsCannonPrinter,DeliPrinter{
    	@override
    	public void print(){
    		System.out.println("This is computer!!!");
    	}
    	public static void main(String[] args){
    		new Computer.print();
    	}
    }
    

    这个时候会出来个问题,你重写的打印的方法到底是实现了哪个接口的打印方法?
    如果CannonPrinter接口和DeliPrinter接口的print()方法相同,那么编译器认为你同时都实现了两个接口的两个方法,并且运行哪个方法都可以,因为两个接口的print()方法都一样。
    输出结果

    This is computer!!!
    

    如果同名方法只是参数类型不同呢?

    interface CanonPrinter{
    	void print(StringBuilder msg);
    }
    
    interface DeliPrinter{
    	void ptint(String msg);
    }
    
    class Computer implementsCannonPrinter,DeliPrinter{
    	@override
    	public void print(String msg){
    		System.out.println(msg);
    	}
    
    	@override
    	public void print(StringBuilder msg){
    		System.out.println(new StringBuilder(msg));
    	}
    	
    	public static void main(String[] args){
    		new Computer.print("This is Computer!!!");
    		new Computer.print(new StringBuilder("This is Computer!!!"))
    	}
    }
    

    编译器可以准确区分,没有产生歧义,所以输出结果

    This is Computer!!!
    This is Computer!!!
    

    如果print()方法返回参数不同呢?

    interface CanonPrinter{
    	String print();
    }
    interface DeliPrinter{
    	StringBuilder ptint();
    }
    
    class Computer implementsCannonPrinter,DeliPrinter{
    	@override
    	public String print(){                             //如果只实现了CanonPrinter 的返回类型为String的print(),
    		return "This is computer!!!";               //没有实现DeliPrinter的StringBuilder的print()方法,编译器会报错	                                                                         
    	}                                                  //所以只实现一个接口的方法,是违背接口的规则的,不能通过编译。
    
    	@override
    	public int  print(){                                     //如果实现了两个方法,编译器则会报错,因为名字重复
    		return new StringBuilder("This is computer!!!");  //当对象调用的时候,不知道调用的是哪个方法                                                                         
    	}                                                        
    
    	
    	public static void main(String[] args){
    		new Computer.print();                                      //我调用的是哪个方法呢?
    	}
    }
    

    如果两个不同的接口各有同名且不同返回类型的方法,如果一个类想同时实现这两个接口,无解,在编译时就会报错,没有办法实现。除非把问题变得复杂,使用内部类。

    interface CanonPrinter{
    	String print();
    }
    interface DeliPrinter{
    	StringBuilder ptint();
    }
    
    class Computer implements CannonPrinter{
    	@override
    	public String print(){                             
    		return "This is computer!!!";               
    	}                                                  
    
    	@override
    	public int  print(){
    		return new StringBuilder("This is computer!!!");  
    	}                                                        
    	class MultiComputer implements DeliPrinter{
    		@override
    		public String print(){                            
    			return "This is computer!!!"; 
    		}                                                  
    
    		@override
    		public int  print(){
    			return new StringBuilder("This is computer!!!");  
    		}
    	}
    }
    

    但是Java8新特性后

    public class Java8Tester {
       public static void main(String args[]){
          Vehicle vehicle = new Car();
          vehicle.print();
       }
    }
     
    interface Vehicle {
       default void print(){
          System.out.println("我是一辆车!");
       }
        
       static void blowHorn(){
          System.out.println("按喇叭!!!");
       }
    }
     
    interface FourWheeler {
       default void print(){
          System.out.println("我是一辆四轮车!");
       }
    }
     
    class Car implements Vehicle, FourWheeler {
       public void print(){
          Vehicle.super.print();
          FourWheeler.super.print();
          Vehicle.blowHorn();
          System.out.println("我是一辆汽车!");
       }
    }
    

    输出结果

    我是一辆车!
    我是一辆四轮车!
    按喇叭!!!
    我是一辆汽车!
    

    这样你就可以区分使用哪个接口的方法。
    同时default方法还可以解决兼容性。
    当你在接口中添加一个方法时,需要所有实现它的类都实现它的抽象方法。就会带来不必要的操作,但如果使用默认方法,你只需在接口中添加好方法体,之后在需要实现的类中调用就可以了,减少了不必要的操作。
    例如:

    interface Printer{
    	void print{};
    }
    

    实现类

    class computer implements Printer{
    	@override
    	public void print(){
    		System.out.print("This is Computer");
    	}
    }
    class SmartPhone implements Printer{
    	@override
    	public void print(){
    		System.out.print("This is smartPhone");
    	}
    }
    

    如果需要给接口添加一个方法

    interface Printer{
    	void print{};
    	default void println(){
    		System.out.println("增加了Println()方法")
    	};                                                                                   //新添加的方法
    }
    

    实体类需要实现

    class Computer implements Printer{
    	@override
    	public void print(){
    		System.out.print("This is Computer");
    	}
    	@override
    	default void prinln(){
    		System.out.println("This is println() for Computer");             //这里用,就在这里重写好了,其他实现了Printer的类就不用管了
    	}
    	
    }
    class SmartPhone implements Printer{
    	@override
    	public void print(){
    		System.out.print("This is smartPhone");
    	}
    }
    

    接口中的静态方法可以用做保存常用方法

    我们知道常量可以用接口来保存
    例如

    interface addressCodeConstant{
    	String CHINA = "CN";
    	String AMERICA = "US";
    }
    

    同理常用方法,也就是常用工具方法可以用static来修饰
    例如

    interface getAddressCode{
    	static String returnAdressCod(String country){
    		switch (country){
    			case CHINA :
    				return CN;
    			case AMERICA:
    				return US;
    			default:
    				retrun null;
    		} 	
    	}
    }
    

    相当于

    public final getAddressCode{
    	public String returnAdressCod(String country){
        		switch (country){
        			case CHINA :
        				return CN;
        			case AMERICA:
        				return US;
        			default:
        				retrun null;
        		} 	
        	}
    }
    

    只不过以后的常用方法可以存储像常量一样存储在接口中了。

    标记接口

    没有成员的接口(仅定义一个空的接口)称为标记或标记接口。 例如:可序列化,可克隆,远程等。它们用于向JVM提供一些基本信息,以便JVM可以执行一些有用的操作。

    //How Serializable interface is written?  
    public interface Serializable{  
    
    }
    
    展开全文
  • java抽奖接口后台管理源码(包含xml,controller,service.html),与我上传的资源后端接口,前端展示,后台管理一套
  • JAVA基础——接口(全网最详细教程)

    万次阅读 多人点赞 2018-05-10 09:46:42
    官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 我的解释:接口...

                                       Java基础——接口


     

     

    接口概念


        官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)

        我的解释:接口可以理解为一种特殊的类,里面全部是由全局常量公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。(JDK1.8之前可以这样理解)

     

    接口的特点


        就像一个类一样,一个接口也能够拥有方法和属性,但是在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体)。

     

    • 接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。
    • 一个接口就是描述一种能力,比如“运动员”也可以作为一个接口,并且任何实现“运动员”接口的类都必须有能力实现奔跑这个动作(或者implement move()方法),所以接口的作用就是告诉类,你要实现我这种接口代表的功能,你就必须实现某些方法,我才能承认你确实拥有该接口代表的某种能力。
    • 如果一个类实现了一个接口中要求的所有的方法,然而没有提供方法体而仅仅只有方法标识,那么这个类一定是一个抽象类。(必须记住:抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,即有方法体的方法。接口是百分之百的抽象类
    • 一个JAVA库中接口的例子是:Comparator 接口,这个接口代表了“能够进行比较”这种能力,任何类只要实现了这个Comparator接口的话,这个类也具备了“比较”这种能力,那么就可以用来进行排序操作了。

    为什么要用接口


    1.     接口被用来描述一种抽象。
    2. 因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限
    3. 接口也被用来实现解耦。
    4. 接口被用来实现抽象,而抽象类也被用来实现抽象,为什么一定要用接口呢?接口和抽象类之间又有什么区别呢?原因是抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的。

     

     

     

    接口的语法实现


        为了声明一个接口,我们使用interface这个关键字,在接口中的所有方法都必须只声明方法标识,而不要去声明具体的方法体,因为具体的方法体的实现是由继承该接口的类来去实现的,因此,接口并不用管具体的实现。接口中的属性默认为Public Static Final.一个类实现这个接口必须实现这个接口中定义的所有的抽象方法。

        一个简单的接口就像这样:拥有全局变量和抽象方法。

        为了实现这个接口,我们使用implements关键词去实现接口:

    其中testClass类实现了我们上面刚才定义的 in1 这个接口,既然你要实现接口,也就是实现接口代表的一种能力,那么你就必须去实现接口给你规定的方法,只有把接口给你规定的抽象方法都给实现了,才承认你这个类实现了这个接口,实现了这个接口代表的某种功能。上图实现了接口中规定的display()方法。

        写一个测试类,用来测试一下我们刚才实现的这个接口,因为testclass类的对象t实现了接口规定的display方法,那么自然而然就可以调用display()方法咯。

        有兴趣的同学可以去这个在线IDE亲自试一试:点击打开链接

     

     

    接口的进一步理解


     

        我们知道,如果某个设备需要向电脑中读取或者写入某些东西,这些设备一般都是采用USB方式与电脑连接的,我们发现,只要带有USB功能的设备就可以插入电脑中使用了,那么我们可以认为USB就是一种功能,这种功能能够做出很多的事情(实现很多的方法),其实USB就可以看做是一种标准,一种接口,只要实现了USB标准的设备我就认为你已经拥有了USB这种功能。(因为你实现了我USB标准中规定的方法),下面是具体的例子:

     

    先声明USB接口:其中规定了要实现USB接口就必须实现接口规定实现的read( )和write( )这两个方法。

    interface USB {
       
    void read();

       
    void write();
    }

    然后在写一个U盘类和一个键盘类,这两个类都去实现USB接口。(实现其中的方法)

    class YouPan implements USB {

        @Override

        public void read() {

            System.out.println("U盘正在通过USB功能读取数据");

        }

        @Override

        public void write() {

            System.out.println("U盘正在通过USB功能写入数据");

        }

    }

     

     

    这是U盘的具体实现。

    class JianPan implements USB {

        @Override

        public void read() {

            System.out.println("键盘正在通过USB功能读取数据");

        }

        @Override

        public void write() {

            System.out.println("键盘正在通过USB功能写入数据");

        }

    }

     

     

    这是键盘的具体实现。

        那么,现在U盘和键盘都实现了USB功能,也就是说U盘和键盘都能够调用USB接口中规定的方法,并且他们实现的方式都不一样。

    我们在写一个测试,来看看具体的实现:

    public class Main {

        public static void main(String[] args) {

            //生成一个实现可USB接口(标准)的U盘对象

            YouPan youPan = new YouPan();

            //调用U盘的read( )方法读取数据

            youPan.read();

            //调用U盘的write( )方法写入数据

            youPan.write();

            //生成一个实现可USB接口(标准)的键盘对象

            JianPan jianPan = new JianPan();

            //调用键盘的read( )方法读取数据

            jianPan.read();

            //调用键盘的write( )方法写入数据

            jianPan.write();

        }

    }

     

     

     

    结果如下:

     

     

        感兴趣的同学可以去在线IDE平台自己验证一下:点击打开链接

     

     

    关于接口的几个重点


    1. 我们不能直接去实例化一个接口,因为接口中的方法都是抽象的,是没有方法体的,这样怎么可能产生具体的实例呢?但是,我们可以使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法。因此,上图中最后的方法调用我们还可以这样写:(实际上就是使用了Java中多态的特性)

    public class Main {

        public static void main(String[] args) {

            //生成一个实现可USB接口(标准)的U盘对象

            //但是使用一个接口引用指向对象

            //USB接口类引用可以指向一个实现了USB接口的对象

            USB youPan = new YouPan();

            //调用U盘的read( )方法读取数据

            youPan.read();

            //调用U盘的write( )方法写入数据

            youPan.write();

            //生成一个实现可USB接口(标准)的键盘对象

            //但是使用一个接口引用指向对象

            //USB接口类引用可以指向一个实现了USB接口的对象

            USB jianPan = new JianPan();

            //调用键盘的read( )方法读取数据

            jianPan.read();

            //调用键盘的write( )方法写入数据

            jianPan.write();

        }

    }                                                                                                                                     

     

     2.一个类可以实现不止一个接口。

     

    3.一个接口可以继承于另一个接口,或者另一些接口,接口也可以继承,并且可以多继承

    4.一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法。

    5.接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的。

    6.接口用来弥补类无法实现多继承的局限。

    7.接口也可以用来实现解耦。

    接口的通俗理解


     

        前面我们讲多态的时候用“空调”——“遥控器”的方式去理解多态,实际上在上面的的几个重点中的第一条讲的也是多态的实现,比如,我们可以把“节能”作为一种标准,或者说节能就是一个“接口”,这个接口中有一个方法,叫做变频方法,任何空调,如果要称得上叫做节能空调的话,那么必须实现“节能”这个接口,实现“节能”这个接口,也就必须实现“节能”接口中规定实现的“变频”方法,这样才算是真正的实现了“节能”这个接口,实现了“节能”这个功能。

        当某个空调实现了“节能”接口后,这个空调就具备了节能的功能,那么我们也可以不用空调类的引用指向空调对象,我们可以直接使用一个“节能”接口类型引用的“遥控器”去指向“空调”,虽然这个“遥控器”上面只有一个按键,只有一个“变频”的方法,但是“遥控器”所指向的空调是实现了“节能”这个接口的,是有“变频”方法的实现的,我们用这个只有一个“变频”方法的遥控器去命令空调调用“变频”方法,也是行得通的,实在不清楚的同学可以去看我的另一篇文章:JAVA之对象的多态性

     

     

    接口的标识用法


        虽然接口内部定义了一些抽象方法,但是并不是所有的接口内部都必须要有方法,比如Seriallizable接口,Seriallizable接口的作用是使对象能够“序列化”,但是Seriallizable接口中却没有任何内容,也就是说,如果有一个类需要实现“序列化”的功能,则这个类必须去实现Seriallizable接口,但是却并不用实现方法(因为接口中没有方法),此时,这个Serilizable接口就仅仅是一个“标识”接口,是用来标志一个类的,标志这个类具有这个“序列化”功能。具体的实现请参考我的另一篇文章——JAVA之IO流。

     

    接口在生活中的思想体现


    其实,在我们的生活当中,有很多地方都体现了“接口”的思想,想必,正在阅读这篇博文的你,是不是也喜欢摄影呢?

    佳能(Canon)EOS 80D 单反相机 单反套机(EF-S 18-200mm f/3.5-5.6 IS 单反镜头)

    玩摄影的童鞋都知道,单反由相机镜头组成,相机分不同的型号,有半画幅的,也有全画幅的。镜头也是一样的,分长焦,短焦;还有定焦和变焦。每种镜头都有各自特定的发挥场景正是因为镜头的多元化,使得我们的摄影能够“术业有专攻”。大家想一想,如果我们的单反相机部分和镜头部分是固定在一起的,不能够更换镜头,那么将会多么的糟糕啊!

    因此,每个相机品牌为了能够兼容不同的镜头,各自发布了一套镜头卡口的标准,这套标准就好比我们前面提到的“接口”,都是某种“约束”。举个栗子,我们佳能的相机,不管你是哪一家镜头生产厂商,腾龙也好,适马也好,只要你按照我佳能卡口的标准来生产镜头,你生产的镜头都能够很好的在我佳能相机上面驱动。

    因此,当我们打开“狗东”,准备给自己的新相机买镜头的时候,就不难发现,我们需要根据自己相机的品牌来挑选特定卡口的镜头,这样的镜头才能被我们的相机正常驱动。

    回到Java上面来说,其实接口给我们带来的最大的好处就是“解耦”了,相机能够搭配不同的镜头,才能有各种各样的搭配玩法,变得更加的灵活。在软件系统中也是一样的,接口可以有很多不同“特色”的实现类,我们只需要声明同一个接口,却可以引用很多个该“接口”引申出来的“子类”,这不也大大增强了我们软件系统中组件的灵活性吗?

    聪明的你,对于“接口”的理解是不是又更加的深入了呢?

     

    基础不牢?新手不友好?无人带路?关注《扬俊的小屋》公众号吧!


     

     

     

    参考资料


    1.Java开发实战经典》 李兴华著  清华大学出版社

    2.https://www.geeksforgeeks.org/interfaces-in-java  作者:Mehak Kumar. and Nitsdheerendra.   翻译:刘扬俊

     

    博客文章版权说明


    第一条 本博客文章仅代表作者本人的观点,不保证文章等内容的有效性。

    第二条 本博客部分内容转载于合作站点或摘录于部分书籍,但都会注明作/译者和原出处。如有不妥之处,敬请指出。

    第三条 征得本博客作者同意的情况下,本博客的作品允许非盈利性引用,并请注明出处:“作者:____转载自____”字样,以尊重作者的劳动成果。版权归原作/译者所有。未经允许,严禁转载

    第四条 对非法转载者,“扬俊的小屋”和作/译者保留采用法律手段追究的权利

    第五条 本博客之声明以及其修改权、更新权及最终解释权均属“扬俊的小屋”。

    第六条 以上声明的解释权归扬俊的小屋所有。

     

    展开全文
  • java面向接口编程

    2014-01-08 18:28:20
    面向接口编程的例子,生活中的实例来说明接口的概念,对理解java接口有很大帮助!
  • Java到Python 通过http调用接口的方式实现java调用Python程序,进行数据交互
  • java调用Gmssl中国密接口进行对称与非对称加解密等运算,动态so库进行接口jni方式调用,采取接口形式对外暴露,方便对接系统调用相关java接口进行相关运算操作。
  • Java 中的接口什么作用?

    万次阅读 多人点赞 2018-03-10 11:06:29
    Java 中的接口什么作用? 例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那我不如直接就在这个类中写实现方法岂不是更便捷,还省去了定义接口接口java中的作用是什么?个人觉得...

    Java 中的接口有什么作用?
    例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那我不如直接就在这个类中写实现方法岂不是更便捷,还省去了定义接口?接口在java中的作用是什么?个人觉得只是一种规范。大家的看法呢?

    作者:Dion
    链接:https://www.zhihu.com/question/20111251/answer/14012223
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    能问这个问题,说明(1)你很会思考(2)编程水平还是处于起步阶段。“接口是个规范”,这句没错。“不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?既然不是一个类去实现,那就是有很多地方有用到,大家需要统一标准。甚至有的编程语言(Object-C)已经不把接口叫 interface,直接叫 protocol。统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做。比如说:我知道 Comparable 这个接口是用来比较两个对象的,那么如何去比较呢?数字有数字的比较方法,字符串有字符串的比较方法,学生(自己定义的类)也有自己的比较方法。然后,在另外一个负责对象排序(不一定是数字喔)的代码里面,肯定需要将两个对象比较。这两个对象是什么类型呢?Object a,b?肯定不行,a > b 这样的语法无法通过编译。int a,b?也不行?一开始就说了,不一定是数字。….所以,Comparable 就来了。他告诉编译器,a b 两个对象都满足 Comparable 接口,也就是他们是可以进行比较的。具体怎么比较,这段程序不需要知道。所以,他需要一些具体的实现,Comparable 接口有一个方法,叫 compareTo。那么这个方法就是用来取代 <、> 这样的运算符。因为运算符是编译器保留给内置类型(整数、浮点数)进行比较用的,而不是一个广义的比较运算。如果你可以明白 JDK 自身库里面诸如 Comparable 这样已经有的接口,那么就很容易理解自己在开发程序的时候为什么需要用到接口了。

    作者:暗灭
    链接:https://www.zhihu.com/question/20111251/answer/133071950
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    接口是软件工程最重要的概念,在java上要格外感谢Spring的贡献。这个概念对于新人来讲,是比较难理解的,最重要的原因就是需要有一定的代码量,特别是做过一些项目的重构,维护,变更等事情的时候感触才会更深一些。
    1 ,“接口+实现”最常见的优势就是实现类和接口分离,在更换实现类的时候,不用更换接口功能。比较常见的例子是发送短信。一般发送短信的场景包括注册用户,找回密码,重要通知,修改交易密码等。短信现在的结构是先接上各家短信通道公司,再经由联通移动等发送出去。一般而言,短信分成两种,一种注册短信,一次只发给用户一条。这种短信到达率比较高,可能会在99%以上,也要看各种短信通道方,更会区分移动和联通。另外一种是营销短信,这种短信常见于“某公司3周年大庆,1元领取程序员鼓励师”之类的。这种短信到达率非常低。而且也经常会被封掉。但是短信又是注册的第一步,用户体验做的再好,手机收不到验证码也没用。所以觉见的做法是,会备用两个或者是多个短信通道。刚刚已经讲过了,调用短信接口的地方比较多,可能是用户发起的,也可能是程序检测到某种行为触发的。也就是说,会有多个地方调用短信接口,那么我们这个时候要解决的问题就是,能否在更换短信通道方的时候,不更改其他模块中被引入的代码?接口在这个时候就完美的实现了这个功能点。无论是哪个模块,我要发送的内容和预期的结果是一致的,具体是用哪家短信通道的实现类,不重要。所以通常是一个SMSService做为接口,不同的公司因为有不同的实现方式,所以会有多个实现类,比如说SMSService{CorpA}Impl,SMSService{CorpB}Impl。这是一个完美的抽象,无论未来有多少种短信公司接入,无论短信公司的营销人员送了多少个香吻给公司的商务总监,程序员总是能够开心的完成功能。
    2,这对于做单元测试也非常有帮助。如果你是一个有了那么点经验的程序员,如果你还没有习惯TDD的开发。可以体验一下这种写法。还是拿短信为例。先写一个SMSServiceTest。然后写一个Test方法。 这个时候什么都没有,不用管。先直接这么写。int code=SMSSevice.sendTextMessage(mobile,content,type);这个时候IDE会提示你没有这个SMSService,用代码自动生成工具去创建这么一个接口出来。再根据提示把方法创建出来。再写 SMSService smsService=new SMSServiceCorpaImpl();再根据代码把实现类生成了。一般来说IDE会自动留一个空的方法。不用管。这里只是一个简单的例子,但是你发现,当你用TDD的这种方式去写代码的时候,完全不用关系SMSService是怎么内部实现的。你只需要继续写你的单元测试代码好了,明确的知道这个SMSService要做的功能是发送短信,需要传递手机号,内容,类型,返回一个状态码。那么接着说为什么对单元测试很方便?一般而言会用Spring配置Bean,所以实际上你的单元测试代码也不用有改动,无论是测试哪一个实现类,都只通过更改配置文件就可以完成。想想,如果没有接口呢?是不是要对每一个短信通道单独写一个单元测试的方法?
    3,对于不需要频繁更变实现类的方法,是不是就可以不用写接口了?答案是No。整个系统架构的代码可以单纯认为有四部分构成。Model+Interface+Service+UtilModel是纯粹的Pojo,贫血模型,Inteface和Service是接口和实现分开的,Util是全项目通用,或者是跨项目通用的,跟业务逻辑没有任何关系的。写接口最大的好处就是在你写的Controller代码,或者是Service里的主要业务逻辑代码的时候,屏蔽掉细节。写一个业务逻辑的时候,比如说修真院的加入班级。第一步,做校验,用户是否为空,班级是否不存在,是否已经加入了班级等等。第二步,更新班级和用户的关系表,更新班级总人数,更新职业总人数,更新用户的最新班级ID。第三步,发送系统通知,告知用户加入班级成功。如果说不用接口,只用实现类的话,第一种方式就是把所有的代码都写在这个Controller里去,代码会非常非常繁琐,一个函数突破几千行轻轻松松,而且改动起来很麻烦。第二种方式就是抽象出来函数。这种方式在某种程度上能够解决代码块大的问题,但是你必须要New一个实现类出来,想想在上述逻辑中,需要new几个实现类?这些实现类就会被New的各处都是,甚至改个名字都很蛋疼。但是如果你使用接口的话,你会发现,接口是强制于你去将复杂的业务逻辑抽象成具体做的事儿。比如说,if(user==null){ // to do something}就变成了CheckUser(uid)这么一个接口。实现类也明确了自已要做的事情。从某种程度上来说,抽象成一个私有方法也能解决这个问题,但是一般都会推荐,如果你发现你写了很多私有方法,要么是他们可以继续演化成一个util,要么是可以成为一个Service。嗯,说的有点乱。

    作者:David
    链接:https://www.zhihu.com/question/20111251/answer/99145627
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    1. 接口是一种规范很好,你已经知道接口是一种规范了!下面这张图是我们生活中遇到的接口:电源插座接口。没错!它就是一种规范,中国2010年制定的插座标准。2. 为什么需要规范呢?因为有了接口规范:任何电器只有有符合规范的插头,就可以获得电力任何厂家(西门子插座,TCL插座,公牛插座…)按照规范进行制作,就能进行供电每个厂家插座的生产技术、工艺都不一样,因为接口的implementation可以不一样,但是并不影响电器的正常工作。插座的内部实现对于电器来说是完全屏蔽的。对于软件开发是类似的:按照接口规范进行方法调用,就能获得所期望的功能按照接口规范实现接口的的方法,就能提供所期望的功能接下来是重点了:软件开发大多是一个协作性的工作:电器和插座分别是不同人完成的,有了接口大家就能分头开干,都按照接口来办事,各自做完就能轻松地整合到一起。各部分的测试也更加方便。软件需要不断演化:今天你用了公牛的插座,过了一年你可能换个西门子的插座,要做没有这套国家接口标准,各自为政,那估计你是换不了插座了。你想想,咱们每次去美国出差,都得带个转接头,否则就跪了,多不方便啊,因为接口规范不同啊!(这些个转接头你是不是闻道一种浓浓的Adapter模式的味道)。3. 什么时候需要通过接口建立规范为了抽象系统的某种公共行为,或者封装变化性,进行系统设计的时候你需要抽取出接口,这样将来你的系统将更加灵活。而你所说的,直接写实现的方式在确定性的场景下当然也可以,不涉及到分工协作、变化性、测试方便等因素时,当然用不着接口了。比如一般情况下你犯不着为一个Pojo的getter和setter也弄个接口和实现分离。所以面向对象的大神们孜孜不倦地教导我们说:接口和实现分离,面向接口编程。
    展开全文
  • zigbee4java, Java API为ZigBee网络提供简单的Java接口 面向Java的Java API为ZigBee网络提供简单的Java接口。 用于嵌入式或者网关模式的in可以用于Java版本 3 。 在网关模式下运行网关进程,以便同时为ZigBee网络...
  • cpu-manager:Java:使用Comparator接口管理记录
  • java接口编写规则

    千次阅读 2019-01-28 10:11:12
    服务方 所有接口提供统一入口,不同接口传递不同参数。 优点:便于控制请求参数和返回结果;...优点:整个接口有哪些字段,什么类型,是否为必填,什么含义,一目了然。并且方便验证。 消费方 接口...

    标题服务方

    1. 所有接口提供统一入口,不同接口传递不同参数。
      优点:便于控制请求参数和返回结果;
      既然写了接口,还需要写一个接口查询功能。记录接口的信息:请求参数,请求结果,成功还是失败,失败原因。方便查询。否则,如果没有这个功能,到后面每次失败都要去查日志。
    2. 接口所有字段定义为一个dto对象。
      优点:整个接口有哪些字段,什么类型,是否为必填,什么含义,一目了然。并且方便验证。

    消费方

    1. 接口调用使用一个入口。
      优点:方便控制;

    2. 所有请求参数创建为1个dto对象(比如:UserInfoAddRequestDto),同上面的第二点。所有请求参数创建为1个dto对象,同上面的第二点。

    3. xx

    总结

    1. 把接口的所有有共通的代码,全部提取出来。方便统一管理,代码整洁。
    展开全文
  • 前后端唯一联系变成了API接口,API文档变成了前后端开发人员&amp;amp;amp;amp;测试人员联系的纽带。所以一款强大的Restful API文档就变得至关重要了。而目前在后端领域,基本上是Swagger的天下了。 Swagger2综述...
  • Java 接口规范与最佳实践

    千次阅读 2018-11-12 16:21:54
    格式统一:这里涉及很多方面,包括:接口返回类型、命名规则以及参数顺序 在我们所有的API方法中,要么是全是getXYZ()格式,要么全是xyz(),最好不要两种格式都有。 假设我们有方法重载,原始方法接受参数Object...
  • Java接口实现文件上传

    万次阅读 2019-05-09 12:51:25
    因工作需要,在后台管理页面加入一个上传文件的模块,虽然接口的代码很简单,但实现期间遇到了一些比较有趣的坑,特记录下来。 需求 实现文件上传,并提供一个可供下载的路径。 想法 文件上传代码暂且不谈,先说说...
  • Java实现远程接口访问,webservers配置,详细介绍了如何实用webservers实现远程接口访问功能
  • java接口测试

    千次阅读 2017-11-14 10:30:55
    第一次做接口测试,网上找了很久,找不到想要的,只能自己摸索写了测试代码T.T ApiRequestUtil.javapackage com.util.api;import java.io.BufferedReader; import java.io.IOException; import java.io....
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    文章目录Java概述何为编程什么Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么Java程序的主类?应用程序和小程序的...
  • 海康威视 综合安防管理平台8700 java调用C++接口,提供录像下载相关功能! maven项目,Eclipse导入注意!
  • java快速生成接口文档方法总结

    千次阅读 2021-07-27 19:36:22
    常常在项目收尾阶段,客户需要项目的接口文档,或者是一个大的sass平台,各个产品之间互相调用的时候,需要对方提供接口文档 通常来说,接口文档属于产品的技术沉淀,是一个长期积累的过程,然而,很多时候,开发...
  • 走进Java接口测试之流行框架SpringBoot

    千次阅读 2018-12-10 09:56:34
    文章目录引言Spring 历史Spring 1.x 时代Spring 2.x 时代Spring 3.x 到 Spring 4.xSpringBoot 的诞生什么是SpringbootSpringBoot 特点SpringBoot 优势SpringBoot 开发更简单SpringBoot 测试更简单SpringBoot 配置更...
  • java后端 解决app接口版本管理问题

    千次阅读 2018-12-25 11:04:55
    当app迭代时需要,java后端的接口也可能会迭代。 相同的接口,传参和处理方式都会不懂,如果在代码中做向下兼容不可行了,就需要写多个接口进行版本区分。当版本接口不多时,可以通过接口传参然后判断来实现,但是...
  • java 接口版本控制

    千次阅读 2018-04-20 13:32:41
    方式一:利用URL[html] view plain copyHTTP GET: https://test.com/app/appversion-1/versiontest/vn1 方式二:利用用户自定义的request header[plain] view plain copyHTTP GET: ...
  • 接口测试工具(需要java_JDK)部署环境。
  • java调用https接口

    万次阅读 2019-07-10 17:59:36
    // 创建SSLContext对象,并使用我们指定的信任管理器初始化 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null,...
  • 在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组,可以达到将枚举元素分类组织的目的。举例来说,假设你想用enum来表示不同类别的食物,同时还希望每个enum元素仍然保持Food类型。那么可以这样实现:...
  • Java接口自动化

    2020-09-24 14:04:52
  • 创建daoImp包,在该包下添加 AccountDaoImp.java(账号接口实现文件)和 ClassesDaoImp.java(学生接口实现文件) AccountDaoImp.java 右击daoImp包,添加一个名为AccountDaoImp的class文件,在添加接口选项处选择...
  • 接口什么什么接口

    万次阅读 多人点赞 2019-07-31 14:27:32
    什么接口? 1、什么接口?  接口一般来讲分为两种: (1)程序内部的接口:方法与方法、模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 789,372
精华内容 315,748
关键字:

java接口管理什么意思

java 订阅