接口的定義和調用

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

 1 //定义接口InterA
 2 interface InterA
 3 {
 4  void fun();
 5 }
 6 //实现接口InterA的类B
 7 class B implements InterA
 8 {
 9  public void fun()
10  {
11   System.out.println(“This is B”);
12  }
13 }
14
15 //实现接口InterA的类C
16 class C implements InterA
17 {
18  public void fun()
19  {
20   System.out.println(“This is C”);
21  }
22 }
23
24 class Test
25 {
26  public static void main(String[] args)
27  {
28   InterA a;
29   a= new B();
30   a.fun();
31   a = new C();
32   a.fun();
33  }
34 }

输出结果为:

This is B
This is
C

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

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

  结束语

  以上就是java运行时多态性的实现方法,大家在编程过程中可以灵活运用,但是在性能要求较高的代码中不提倡运用运行时多态,毕竟Java的运行时动态方法调用较之普通的方法调用的系统开销是比较大的。

时间: 2024-10-09 10:56:51

接口的定義和調用的相关文章

Notepad++ 自定義關鍵字

Notepad++是一款輕便好用的編輯器,但可能有些語言的關鍵字不全,比如SQL中,默認關鍵字沒有Merge. 如何給Notepad++中的語言增加關鍵字,而不是大動干戈自定義一個語言? 步驟: Setttings --> Style  Configurator --> Language,User-defined keywords

java_在JFrame上使用自定義圖片

package drawImage;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JPanel;public class DrawImage extends

java_自定義一個List(類似ArrayList)

TestMain.java package listTest;public class TestMain {    public static void main(String[] args){        MyList<String> myList = new MyList<>();        myList.add("1");        myList.add("2");        myList.add("3"

Q郵箱轉移自定義目錄中的郵件

1.之前在Q郵箱上建立了許多規則和收件箱,現在想統一用Mac上的郵局管理 2.Mac上會同步對應郵箱的自定義目錄,此時這些目錄便十分多餘礙眼 3.Q郵箱單頁顯示郵件數量上限是100,這意味著手動轉移十分痛苦 4.於是寫了個applescript,但不知為啥一用腳本就轉移失敗 5.在debug的過程中發現刪除這些分類時,是不一定連信一起刪的,可以勾選checkbox選擇移入收件箱....wtf... 此文僅僅告誡自己多動腦少作死

預加載combobox定義

script裡定義如下: $(function(){ $('#CUST_NAME').combobox({  valueField: 'value',  textField: 'label',  data: [{   label: '不用輸入',   value: '0'    },{   label: '詢問輸入',   value: '1'  },{   label: '必須輸入',   value: '2'  }] }); $('#CUST_NAME'').combobox('setVal

vue自定義指令

自定義指令可以允許代碼複用, 全局自定義指令 vue.directive('指令名',{鉤子函數:指令函數}) 局部自定義指令: vue({ directives:{指令名:{鉤子函數:指令函數} }) 自定指令提供了幾個鉤子函數: bind.inserted.update.componentUpdated.unbind 鉤子函數參數: el,binding,vnode,oldVnode 有時也可以不使用鉤子函數. 原文地址:https://www.cnblogs.com/Zhengxiaoxi

Linux系統SUDO的使用定義及設定

什麼是sudo?Sudo是可以讓某個用户不需要擁有(管理員)的賬號密碼,可以執行管理員的權限的.作為管理員可以指派某些用户可以執行某些 特定命令. Sudo的特點 它的特性主要有这样幾點: Sudo能够限制用户只在某台主機上運行某些命令 Sudo提供了豐富的日志,詳细地記錄了每個用户幹了什麼. 它能够將日記傳到中心主機或者日記服務器 Sudo使用時間戳文件來執行類似的"檢票"系统.當用户調用 sudo并且输入它的密碼時, 用户获得了一张存活期为5分钟的票 (这个值可以在编译的时候改变)

spring框架中list(JSONArray)的date类型转json类型的string 【BaseController中的定義函數】

/** * * 下一是date和time转换json的spring代码工具 * * **/ public class JsonDateValueProcessor implements JsonValueProcessor { private String format ="yyyy-MM-dd"; private String format1 ="HH:mm:ss"; public Object processArrayValue(Object value, Js

json对象的传输函數的定義

/** * List转换json格式向前端传递json数据流 * @param list * @param response * @throws IOException */ public void writeJson(List list,HttpServletResponse response) throws IOException{ JSONArray jarray=JSONArray.fromObject(list); response.setHeader("Content-type&qu