IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java编程思想(接口) -> 正文阅读

[Java知识库]java编程思想(接口)

一.接口

接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含静态常量.

Shape类并没有包含别的非抽象方法, 也可以设计成一个接口
interface IShape { 
void draw(); 
} 
class Cycle implements IShape { 
@Override 
public void draw() { 
System.out.println("○"); 
} 
} 
public class Test { 
public static void main(String[] args) { 
IShape shape = new Rect(); 
shape.draw(); 
} 
} 

使用 interface 定义一个接口

接口中的方法一定是抽象方法, 因此可以省略 abstract

接口中的方法一定是 public, 因此可以省略 public Cycle 使用 implements 继承接口.

此时表达的含义不再是 "扩展", 而是 "实现" 在调用的时候同样可以创建一个接口的引用, 对应到一个子类的实例.

接口不能单独被实例化.

扩展(extends) vs 实现(implements)

扩展指的是当前已经有一定的功能了, 进一步扩充功能.

实现指的是当前啥都没有, 需要从头构造出来

接口中只能包含抽象方法.

对于字段来说? ?接口中只能包含静态常量(final static).?

interface IShape { 
void draw(); 
public static final int num = 10; 
}

其中的 public, static, final 的关键字都可以省略. 省略后的 num 仍然表示 public 的静态常量.?

1. 我们创建接口的时候, 接口的命名一般以大写字母 I 开头.

2. 接口的命名一般使用 "形容词" 词性的单词.

3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性.

一个错误的代码
interface IShape { 
 abstract void draw() ; // 即便不写public,也是public 
} 
class Rect implements IShape { 
 void draw() { 
 System.out.println("□") ; //权限更加严格了,所以无法覆写。
 } 
} 

如何实现多个接口:
有的时候我们需要让一个类同时继承自多个父类. 这件事情在有些编程语言通过 多继承 的方式来实现的.
然而 Java 中只支持单继承, 一个类只能 extends 一个父类. 但是可以同时实现多个接口, 也能达到多继承类似的效果.
现在我们通过类来表示一组动物.

class Animal { 
protected String name; 
public Animal(String name) { 
this.name = name; 
} 
} 
//另外我们再提供一组接口, 分别表示 "会飞的", "会跑的", "会游泳的".
interface IFlying { 
void fly(); 
} 
interface IRunning { 
void run(); 
} 
interface ISwimming { 
void swim(); 
} 
//接下来我们创建几个具体的动物
//猫, 是会跑的.
class Cat extends Animal implements IRunning { 
public Cat(String name) { 
super(name); 
} 
@Override 
public void run() { 
System.out.println(this.name + "正在用四条腿跑"); 
} 
} 
//鱼, 是会游的.
class Fish extends Animal implements ISwimming { 
 public Fish(String name) { 
 super(name); 
 } 
 @Override 
 public void swim() { 
 System.out.println(this.name + "正在用尾巴游泳"); 
 } 
} 
//青蛙, 既能跑, 又能游(两栖动物)
 
class Frog extends Animal implements IRunning, ISwimming { 
public Frog(String name) { 
 super(name); 
 } 
 @Override 
 public void run() { 
 System.out.println(this.name + "正在往前跳"); 
 } 
 @Override 
 public void swim() { 
 System.out.println(this.name + "正在蹬腿游泳"); 
 } 
} 
//提示, IDEA 中使用 ctrl + i 快速实现接口
//还有一种神奇的动物, 水陆空三栖, 叫做 "鸭子"
class Duck extends Animal implements IRunning, ISwimming, IFlying { 
 public Duck(String name) { 
 super(name); 
 } 
 @Override 
 public void fly() { 
 System.out.println(this.name + "正在用翅膀飞"); 
 } 
 @Override 
 public void run() { 
 System.out.println(this.name + "正在用两条腿跑"); 
 } 
 @Override 
 public void swim() { 
 System.out.println(this.name + "正在漂在水上"); 
 } 
} 

上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类, 同时实现多种接口. 继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性 .

猫是一种动物, 具有会跑的特性.

青蛙也是一种动物, 既能跑, 也能游泳

鸭子也是一种动物, 既能跑, 也能游, 还能飞

这样设计有什么好处呢? 时刻牢记多态的好处, 让程序猿忘记类型. 有了接口之后, 类的使用者就不必关注具体类型, 而 只关注某个类是否具备某种能力.?

例如, 现在实现一个方法, 叫 "散步"

public static void walk(IRunning running){
System.out.println("我带着伙伴去散步");
running.run(); 
} 
在这个 walk 方法内部, 我们并不关注到底是哪种动物, 只要参数是会跑的就行 
Cat cat = new Cat("小猫"); 
walk(cat); 
Frog frog = new Frog("小青蛙"); 
walk(frog); 
// 执行结果 我带着伙伴去散步 小猫正在用四条腿跑 我带着伙伴去散步 小青蛙正在往前跳 
甚至参数可以不是 "动物", 只要会跑! 
class Robot implements IRunning { 
private String name; 
public Robot(String name) { 
this.name = name; 
} @Override 
public void run() { 
System.out.println(this.name + "正在用轮子跑"); 
} 
} 
Robot robot = new Robot("机器人"); 
walk(robot); // 执行结果 机器人正在用轮子跑

对于拥有name score的学生数组,如果我们对其使用array.sort()方法,编译器会报错

所以我们引入comparable接口并对其进行重写?

class Student implements Comparable { 
 private String name; 
 private int score; 
 public Student(String name, int score) { 
 this.name = name; 
 this.score = score; 
 } 
 @Override 
 public String toString() { 
 return "[" + this.name + ":" + this.score + "]"; 
 } 
 @Override 
 public int compareTo(Object o) { 
 Student s = (Student)o; 
 if (this.score > s.score) { 
 return -1; 
 } else if (this.score < s.score) { 
 return 1; 
 } else { 
 return 0; 
 } 
 } 
} 

在 sort 方法中会自动调用 compareTo 方法.

compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象. 然后比较当前对象和参数对象的大小关系(按分数来算). 如果当前对象应排在参数对象之前, 返回小于 0 的数字; 如果当前对象应排在参数对象之后, 返回大于 0 的数字; 如果当前对象和参数对象不分先后, 返回 0; 再次执行程序, 结果就符合预期了.

注意事项: 对于 sort 方法来说, 需要传入的数组的每个对象都是 "可比较" 的, 需要具备 compareTo 这样的能力. 通过 重写 compareTo 方法的方式, 就可以定义比较规则

为了进一步加深对接口的理解, 我们可以尝试自己实现一个 sort 方法来完成刚才的排序过程(使用冒泡排序)
public static void sort(Comparable[] array) { 
 for (int bound = 0; bound < array.length; bound++) { 
 for (int cur = array.length - 1; cur > bound; cur--) { 
 if (array[cur - 1].compareTo(array[cur]) > 0) { 
 // 说明顺序不符合要求, 交换两个变量的位置
 Comparable tmp = array[cur - 1]; 
 array[cur - 1] = array[cur]; 
 array[cur] = tmp; 
 } 
 } 
 } 
} 
 

接口的继承:

interface IRunning { 
 void run(); 
} 
interface ISwimming { 
 void swim(); 
} 
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming { 
} 
class Frog implements IAmphibious { 
 ... 
} 

通过接口继承创建一个新的接口 IAmphibious 表示 "两栖的".

此时实现接口创建的 Frog 类, 就继续要实现 run 方法, 也需要实现 swim 方法. 接口间的继承相当于把多个接口合并在一起

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:41:57  更:2021-11-16 18:44:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:09:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码