“Java的接口及用法”的版本间的差异
(→接口与多态) |
|||
(未显示同一用户的13个中间版本) | |||
第1行: | 第1行: | ||
==问题引入== | ==问题引入== | ||
===代码改呀改=== | ===代码改呀改=== | ||
+ | [[文件:java20-8-2.png]] | ||
+ | |||
+ | 甲、乙 :编写底层调用的代码。 | ||
+ | |||
+ | 丙:外部调用的代码,计算利润、成本、税收 | ||
+ | |||
软件总是迭代升级的,内部代码总是不断更新 | 软件总是迭代升级的,内部代码总是不断更新 | ||
第21行: | 第27行: | ||
==接口的定义== | ==接口的定义== | ||
+ | 接口的使用,和继承中的父类和子类有些相似, | ||
+ | |||
+ | 分为'''接口'''和'''接口的实现类'''两部分。 | ||
+ | |||
+ | '''接口'''定义某个功能的抽象存在。 | ||
+ | |||
+ | '''接口的实现类''' 去具体实现这个功能 | ||
+ | |||
+ | ===接口=== | ||
接口是由常量和抽象方法组成的特殊类 | 接口是由常量和抽象方法组成的特殊类 | ||
第42行: | 第57行: | ||
注解: | 注解: | ||
− | + | 接口的访问修饰符只有public一个。 | |
− | + | ||
+ | 接口可以被继承,它将继承父接口中的所有方法和常量。 | ||
+ | |||
*接口体只包含两部分,一是常量;二是抽象方法。 | *接口体只包含两部分,一是常量;二是抽象方法。 | ||
+ | |||
*接口中的常量必须赋值,并且接口中的属性都被默认为是final来修饰的常量。 | *接口中的常量必须赋值,并且接口中的属性都被默认为是final来修饰的常量。 | ||
+ | |||
*接口中的所有的方法都必须是抽象方法,抽象方法不需要使用abstract关键字声明,直接默认为是抽象的! | *接口中的所有的方法都必须是抽象方法,抽象方法不需要使用abstract关键字声明,直接默认为是抽象的! | ||
− | == | + | ===接口的实现类=== |
既然接口里只有抽象方法,它只要声明而不用定义处理方式,于是自然可以联想到接口也没有办法像一般类一样,再用它来创建对象。利用接口打造新的类的过程,称之为接口的实现(implementation),同时实现了接口的类称之为接口实现类。接口实现格式如下: | 既然接口里只有抽象方法,它只要声明而不用定义处理方式,于是自然可以联想到接口也没有办法像一般类一样,再用它来创建对象。利用接口打造新的类的过程,称之为接口的实现(implementation),同时实现了接口的类称之为接口实现类。接口实现格式如下: | ||
第55行: | 第74行: | ||
… | … | ||
}</nowiki> | }</nowiki> | ||
+ | |||
+ | |||
+ | 例子: | ||
+ | |||
+ | <nowiki>public class BlackPrinter implements Printer{ //打印机接口 | ||
+ | |||
+ | public void print(String content){ | ||
+ | print("black:"+content) | ||
+ | } | ||
+ | }</nowiki> | ||
+ | ====想一想:接口和接口的实现类 与 父类和子类有什么不同?==== | ||
+ | |||
+ | ==接口的实现和使用== | ||
+ | 背景:开发计税软件, | ||
+ | |||
+ | 1.想开放接口供别人使用, | ||
+ | |||
+ | 2.又不想让别人看到太多技术细节。 | ||
+ | |||
===定义接口=== | ===定义接口=== | ||
第98行: | 第136行: | ||
===完成接口的调用=== | ===完成接口的调用=== | ||
+ | 这里用到了接口回调技术。接口回调是指:可以将接口实现类的对象赋给该接口声明的接口变量中,那么该接口变量就可以调用接口实现类对象中的方法。 | ||
+ | |||
<nowiki> | <nowiki> | ||
第141行: | 第181行: | ||
}</nowiki> | }</nowiki> | ||
− | |||
===用接口实现的多态=== | ===用接口实现的多态=== | ||
− | 多态是面向对象编程思想的重要体现,它是建立在继承关系存在基础上的。接口与它的实现类之间存在实现关系,同时也就具有继承关系。因此'''接口可以像父类子类一样使用多态技术''' | + | 多态是面向对象编程思想的重要体现,它是建立在继承关系存在基础上的。接口与它的实现类之间存在实现关系,同时也就具有继承关系。因此'''接口可以像父类子类一样使用多态技术'''。不同的类在使用同一接口时,可能具有不同的功能体现,即接口实现类的方法体不必相同,因此,接口回调可能产生不同的行为。 |
【实例5-10】接口实现程序设计。 | 【实例5-10】接口实现程序设计。 | ||
第163行: | 第202行: | ||
}</nowiki> | }</nowiki> | ||
+ | ==其他== | ||
+ | |||
− | ==一个类同时实现多个接口== | + | ===一个类同时实现多个接口=== |
Java 不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。 | Java 不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。 | ||
2020年5月15日 (五) 03:54的最新版本
目录
问题引入
代码改呀改
甲、乙 :编写底层调用的代码。
丙:外部调用的代码,计算利润、成本、税收
软件总是迭代升级的,内部代码总是不断更新
而现实是,外部调用它的代码总想保持稳定,这个矛盾如何解决 ?
接口的概念
接口这个概念,生活中就已存在,比如:
- 笔记本的一侧提供了各种各样的接口,比如VGA接口、音频接口、网线接口等。我们不需知道笔记本内部的实现细节,就可以通过接口连接笔记本,实现相应功能。
- 学生餐厅的各个窗口实际上上就是餐厅对外的一个个“接口”,我们不需要知道餐厅里做饭的细节,只需要通过餐厅一个个的窗口,就可以买饭、打饭。
在计算机中,Java 程序设计中的接口(Interface)也是一种规范,是用来组织应用程序中的类,并调节它们的相互关系。我们不需要知道程序内部实现的细节,只需要通过程序中提供的接口,就可以调用程序中相关的功能,实现我们想要的操作。
为什么使用接口
隐藏技术细节
在计算机中,Java 程序设计中的接口(Interface)也是一种规范,是用来组织应用程序中的类,并调节它们的相互关系。我们不需要知道程序内部实现的细节,只需要通过程序中提供的接口,就可以调用程序中相关的功能,实现我们想要的操作。
确保上层代码稳定
图书的业务处理需要对图书信息进行进行储存,并进行增加、删除、修改、查询等处理。但是随着我们项目的进展,图书信息可以被先后保存在内存中、文件中、数据库中,相应地,上述那些增删查改的底层操作方法可能会发生变化。为了保持上层业务的稳定性,避免因信息保存方式变化而修改上层业务代码,所以在我们的项目中通过接口描述图书增删查改处理,通过接口调用保持业务代码的稳定。
接口的定义
接口的使用,和继承中的父类和子类有些相似,
分为接口和接口的实现类两部分。
接口定义某个功能的抽象存在。
接口的实现类 去具体实现这个功能
接口
接口是由常量和抽象方法组成的特殊类
接口的格式如下:
[public] interface 接口名 [extends 接口1,接口2…] { [public] [static] [final] 数据类型 常量名=常量值; [public] [static] [abstract] 返回值 抽象方法名(参数列表); }
由接口的声明的语法格式看出,接口是由常量和抽象方法组成的特殊类。 例子:
public interface Printer { //打印机接口 public final int YEAR = 3; public void print(String content); }
注解:
接口的访问修饰符只有public一个。
接口可以被继承,它将继承父接口中的所有方法和常量。
- 接口体只包含两部分,一是常量;二是抽象方法。
- 接口中的常量必须赋值,并且接口中的属性都被默认为是final来修饰的常量。
- 接口中的所有的方法都必须是抽象方法,抽象方法不需要使用abstract关键字声明,直接默认为是抽象的!
接口的实现类
既然接口里只有抽象方法,它只要声明而不用定义处理方式,于是自然可以联想到接口也没有办法像一般类一样,再用它来创建对象。利用接口打造新的类的过程,称之为接口的实现(implementation),同时实现了接口的类称之为接口实现类。接口实现格式如下:
class 类名称 implements 接口A,接口B // 接口的实现 { … }
例子:
public class BlackPrinter implements Printer{ //打印机接口 public void print(String content){ print("black:"+content) } }
想一想:接口和接口的实现类 与 父类和子类有什么不同?
接口的实现和使用
背景:开发计税软件,
1.想开放接口供别人使用,
2.又不想让别人看到太多技术细节。
定义接口
public interface Tax { public void setName(String name); public void setIncome(double income); public double getTax(); }
编写接口的实现类
public class SalaryTax implements Tax{ protected String name; protected double income; public SalaryTax(String n,double i) { this.name = n; this.income = i; } public void setName(String name) { this.name=name; } public void setIncome(double income) { this.income = income; } public double getTax() { if (income <= 5000) { return 0; }else if (income <=8000) { return (income - 5000) * 0.2; }else { return (8000-5000)*0.2 +(income-8000)*0.3; } } }
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
完成接口的调用
这里用到了接口回调技术。接口回调是指:可以将接口实现类的对象赋给该接口声明的接口变量中,那么该接口变量就可以调用接口实现类对象中的方法。
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Tax t1 = new SalaryTax("张丽",7500); t1.setName("张丽");t1.setIncome(8000); System.out.println("纳税额="+t1.getTax()); } }
接口与多态
接口的又一个实现类
public class AllowanceTax implements Tax{ protected String name; protected double income; public AllowanceTax(String n,double i) { this.name = n; this.income = i; } public double getTax() { return 0; } public void setName(String name) { this.name=name; } public void setIncome(double income) { this.income = income; } public static void main(String[] args) { // TODO Auto-generated method stub } }
用接口实现的多态
多态是面向对象编程思想的重要体现,它是建立在继承关系存在基础上的。接口与它的实现类之间存在实现关系,同时也就具有继承关系。因此接口可以像父类子类一样使用多态技术。不同的类在使用同一接口时,可能具有不同的功能体现,即接口实现类的方法体不必相同,因此,接口回调可能产生不同的行为。
【实例5-10】接口实现程序设计。
(续上:接口的另一个
public static void main(String[] args) { // TODO Auto-generated method stub Tax t1 = new SalaryTax("张丽",7500);//接口变量存放对象的引用 Tax t2 = new AllowanceTax("王博士",15000);//接口变量存放对象的引用 System.out.println("纳税额1="+t1.getTax());//接口回调 System.out.println("纳税额2="+t2.getTax());//接口回调 //以上两个getTax函数的实现是否相同?这体现了什么 ? }
其他
一个类同时实现多个接口
Java 不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。
例:一体机类同时实现了打印机和复印件两个接口。
打印机接口:
public interface Printer { //打印机接口 public void print(String content); }
复印机接口:
public interface Copier { //打印机接口 public void copy(String content); }
综合型一体机:(综合实现了打印机和复印件的接口)
public class AllPrinter implements Printer,Copier { public void print(String content) { System.out.println("多功能一体机开始打印:"); System.out.println(content); } public void copy(String content) { System.out.println("多功能一体机开始复印:"); System.out.println(content); } }
主类MainClass:
package main; import entity.*; /*本类对应实训: */ public class MainClass { public static void main(String[] args) { Printer cp = new BlackPrinter(); //Printer cp = new ColorPrinter(); cp.print(" 创业计划书"); AllPrinter ap = new AllPrinter(); ap.print(" 创业计划书"); ap.copy(" 创业计划书"); } }
接口的使用与类的使用有些不同。类会直接使用new关键字来构建一个类的实例进行应用,而接口只能被它的实现类进行进一步的实现才能发挥作用。
参考文档:
[1] https://blog.csdn.net/jdsjlzx/article/details/51974360
[2] https://blog.csdn.net/wei_zhi/article/details/52743109
返回 Java程序设计