
- 涵 义
- 特定结构,特征集合
- 属 于
- 计算机和网络技术
- 适 用
- JAVA
- 中文名
- Java接口
- 外文名
- java interface
-
Java接口
2018-12-24 12:00:36Java接口也表示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接口和类的区别Java 接口
2016-11-07 20:47:55Java 接口 接口(interface)在java语言中就是一个抽象类型,但接口并不是一个抽象类,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。 接口并不是类...Java 接口
接口(interface)在java语言中就是一个抽象类型,但接口并不是一个抽象类,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类是描述对象的属性和方法。而接口却是包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。当类要实现接口中的方法时候,若这个类不是抽象类的话,这个类就要去实现接口中所有的方法、
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在Java中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
抽象类(abstract) :若一个类是用abstract修饰,并且没有方法体的实现的话,就说明是个抽象类;还有若有空可以去看看runoob.com网站,那也有很多的资源;
-
java接口中的default方法
2018-02-24 17:26:16在java8以后,接口中可以添加使用default或者static修饰的方法,在这里我们只讨论default方法,default修饰方法只能在接口中使用,在接口种被default标记的方法为普通方法,可以直接写方法体。实现类会继承接口中的...在java8以后,接口中可以添加使用default或者static修饰的方法,在这里我们只讨论default方法,default修饰方法只能在接口中使用,在接口中被default标记的方法为普通方法,可以直接写方法体。
- 实现类会继承接口中的default方法
如果接口A中有default方法:
public interface A { public default void a(){ System.out.println("这是A"); } }
Test类实现接口A:
public class Test implements A{ }
那么Test类将会继承接口A中的a方法:
public class Test2 { public static void main(String[] args) { Test t = new Test(); t.a(); } }
2.如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法
为什么要重写呢?是因为,类在继承接口中的default方法时,不知道应该继承哪一个接口中的default方法。
接口A:
public interface A { public default void a(){ System.out.println("这是A"); } }
接口B:
public interface B { public default void a(){ System.out.println("这是B"); } }
Test类:
3.如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么子类会继承父类的b方法而不是继承接口中的b方法
接口A:
public interface A { public default void b(){ System.out.println("AAA"); } }
类C:
public class C { public void b(){ System.out.println("CCC"); } }
子类:
public class Test extends C implements A{ }
测试类:
说明子类继承的b方法为父类C中的b方法,不是接口中的default b(){}方法。
-
Vue调用后端java接口
2018-12-18 19:53:30前段时间 做了个学校的春萌项目,其中用到vue连接后端java接口。 先上后端接口代码: package controller; import net.sf.json.JSONObject; import util.DBUtil; import javax.servlet.ServletException; import ...很早之前的了,没有什么参考价值,大家看看热闹就好😄
前段时间 做了个学校的春萌项目,其中用到vue连接后端java接口。
先上后端接口代码:package controller; import net.sf.json.JSONObject; import util.DBUtil; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; @WebServlet(name = "login",urlPatterns = "/login") public class login extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(true); String username = request.getParameter("username"); String password = request.getParameter("password"); DBUtil dbUtil = new DBUtil(); Connection connection = dbUtil.getConnection(); PreparedStatement preparedStatement; ResultSet rs; String psw=""; String sql = "select password from `user` where username=?"; try { preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1,Integer.parseInt(username)); rs = preparedStatement.executeQuery(); while (rs.next()){ psw = rs.getString("password"); } } catch (Exception e){ e.printStackTrace(); } if (password.equals(psw)){ session.setAttribute("username",username); response.getWriter().print("true"); } else response.getWriter().print("false"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
前端调用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> <script src="node_modules/vue/dist/vue.js"></script> <!--axios基于promise--> <script src="node_modules/axios/dist/axios.js"></script> <script src="login.js"></script> <script src="https://cdn.bootcss.com/vue-resource/1.5.1/vue-resource.min.js"></script> <link rel="stylesheet" href="login.css"> </head> <body> <div class="login_interface" id="interface_height"> <img src="ic_login_logo.png" alt="" class="login_logo"> <span id="login_head">智慧图书管理平台</span> <div class="login_input"> <img src="ic_login_number.png" alt="" class="login_number"> <input type="text" value="请输入账号" id="input_number" v-model="username"> </div> <div class="login_input" id="add_top"> <img src="ic_login_password.png" alt="" class="login_number"> <input type="text" value="请输入密码" id="input_password" v-model="password"> </div> <button class="login_unselected" id="tick"></button> <span id="remember_password">记住密码</span> <button id="registered_now"><a href=""><span style="color: grey">立即注册</span></a></button> <button id="login" @click="login()">登录</button> </div> <script> new Vue({ el:'#interface_height', data:{ username:'', password:'' }, methods:{ login:function () { this.$http.post('login',{username:this.username,password:this.password},{emulateJSON:true}).then(function(res){ console.log(res.data); window.location.href = 'index.html'; },function(res){ console.log(res.status); }); } }, created:function(){ } }) </script> </body> </html>
-
Java接口 和 接口
2015-06-20 16:00:491.定义: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。两种含义:一,Java... -
Java接口及接口继承
2019-04-24 17:57:13Java接口 开发工具与关键技术:My Eclipse 10、Java 作者:郑凯丰 撰写时间: 2019年5月2日 修饰符 :public 、abstract [修饰符] interface 接口名称 extends 父接口,父接口1,… { 静态常量定义; 抽象方法定义;... -
java接口开发流程
2018-12-16 18:46:03java接口开发流程 前后端分离接口写法 前后端不分离写法 -
Java 接口做参数,接口回调
2020-07-05 15:53:33JAVA接口做参数,接口回调 接口做参数:将实现某接口的类的对象的引用用作参数传递给该接口参数。该接口通过回调来实现该接口方法。 接口回调:实现某接口的类的对象的引用,赋值给该接口声明的接口变量。 难以理解... -
java接口填写模板
2018-07-20 15:11:33java接口填写模板 java接口填写模板要点要有: 1.接口名称 2.请求地址 3.接口说明 4.接口提供者 5.接口使用者 6.参数说明 6.1参数详情 7.返回值说明 7.1返回值参数详解详情 ... -
Java接口和应用程序接口API的理解
2019-05-19 18:16:21Java接口和应用程序接口API的理解 Java中接口中的方法是抽象方法,API(应用程序接口),他们都是接口。问题是一般的Java接口中的方法是抽象方法,而API中的方法却是可以直接调用的。 1.具体的编程语言中的接口,... -
java接口中方法、属性修饰符详解
2018-06-28 22:41:47java接口的修饰符:abstract(inteeface本身就是抽象的,加不加abstract都一样)。 接口中字段的修饰符:public static final(默认不写) 如下解释: public: 使接口的实现类可以使用这个常量 static:... -
java接口、接口方法、接口属性 的修饰符详解
2019-02-15 12:09:15java接口的修饰符:abstract(默认不写。interface本身就是抽象的,加不加abstract都一样) 接口中字段的修饰符:public static final(默认不写) 解释如下: public: 使接口的实现类可以使用该常量; ... -
java接口可以继承多个接口
2019-03-07 19:11:54classB extends classAjava接口可以多继承。Interface3 extends Interface0, Interface1, interface…… 不允许类多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一个D方法,A如何决定该继承哪一个呢? 但... -
java 接口和抽象类的区别
2018-07-16 19:35:52首先,要强调一点的是,抽象类是类,因此它们不受Java中接口的其他限制,例如抽象类可以拥有状态,但你不能在Java接口上拥有状态。 区别 abstract class interface 语法结构 abstract interface ... -
java接口使用example
2019-01-16 10:23:27java接口使用example定义USB接口代码如下 定义USB接口代码如下 interface USB{ public String read(); public void write(String s); } #手机的usb实现接口 class PHONE implements USB { String s="123&... -
Java接口声明对象
2015-10-11 16:40:28Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化。但是接口不是类,不能使用new 运算符实例化一个接口。如 x=new comparable(......);//这个是错误来... -
JAVA接口机制
2020-05-14 19:17:18java支持多继承吗,答案是否定的 java不支持多继承 接口中所有的方法自动的属于public 接口的特性 接口不是类,不能实例化, 抽象类也不能实例化 可以声明接口类型的变量 抽象类也能声明抽象类型的变量 这个... -
java 接口可以多继承
2015-06-16 10:08:28接口是常量值和方法定义的集合。...java接口可以多继承。Interface3 Extends Interface0, Interface1, interface…… 以下是spring ApplicationContext 接口的代码,同时继承了多个接口 public interface Appli... -
Jmeter之Java接口调用
2018-08-21 09:18:18或者需要对Java接口服务进行性能测试时,需要用到jmeter进行Java接口调用。以下简单介绍下jmeter通过Java请求和Bean shell方式来实现Java接口调用的具体使用方法。 一、jmeter中BeanShel... -
java接口interface理解,接口作用
2017-12-17 20:35:22java 接口interface 1. 固定统一调用的方法(想想适配器模式)public void somefunc(HttpServletRequest resq){ //调用时传来实现该接口的类就行 //里面直接调用接口方法2. 标记作用,作为一个类的标记, 里面空方法... -
Java接口性能优化实例
2019-03-25 12:27:18Java接口性能优化实例 文章目录Java接口性能优化实例概述用到的工具和环境工具环境找瓶颈 概述 最近公司的下单接口有些慢,老板担心无法支撑双11,想让我优化一把,但是前提是不允许大改,因为下单接口太复杂了,... -
php 调用java 接口
2018-03-31 20:55:56//请求 Java 接口 $url = "http://192.168.1.105:8081/credit/udun/udunInfo.do"; $post_data = array ("ydOrderId" => $data['ydOrderId']); $ch = curl_init(); curl_setopt($ch, ... -
Java接口回调一般用法
2017-03-31 20:41:38Java接口回调 -
java接口多继承
2016-07-31 21:24:011.接口是常量值和方法...3.java接口可以多继承。 Interface3 Extends Interface0, Interface1, interface…… 不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢? -
Java接口作为参数传递
2019-04-08 11:36:07记录两种方式,原文链接:Java接口作为参数传递【用处很多】http://www.jufanshare.com/content/70.html 原文中解释比较详细,此处只有实现代码 方式一: package com.jufanshare; /** * @功能: * @开发者:... -
Java接口继承接口
2019-02-27 08:49:26接口A有个方法getName(),接口B继承接口A,不用复写接口A的方法,写接口B自己的东西(业务)即可,当一个类C去继承B接口的时候,是需要复写两个接口中的方法的实现的——语法层 意义: 举个都知道的东西——书。... -
java接口与类的区别
2019-06-17 14:29:40java接口与类的区别 解决方法: 1.接口没有构造方法,不能用于实例化对象。 2.接口中所有的方法必须是抽象方法。 3.http://www.yayihouse.com/yayishuwu/chapter/1975 ... -
java 接口 三种实现方式
2018-09-29 09:42:15无论第一种还是第二种还是,如果我们想要从接口中拿到数据,我们就必须得调用HttpClient或者其他的方式从接口获取信息,这个项目中我使用到的是HttpClient。 HttpClient特性以及使用方法 ... -
Java接口设计模式
2014-03-30 17:26:52Java接口设计模式 java设计模式编程语言工具oop java不允许多重继承,也就是说一个子类只能有一个父类,Son extends FatherA,FatherB 是错误的为了弥补这点不足,java允许实现多个接口, 接口就是给出一些没有... -
python调用java接口发送post请求
2020-03-30 22:03:35我知道我要做的任务了,就是到数据库定时查询出数据,然后调用java接口将数据通过python加密后保存到java数据库。那先不加密试一下能不能调通java接口呗。调用发现失败 然后去把json数据拿到postman调用发现成功...