1.接口的定义

抽象方法本质上是定义接口规范。

  • 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法。
public abstract class Person{
public abstract void run();
}
public class Student extends Person{
@Override
public void run(){}
}
public class Teacher extends Person{
@Override
public void run(){}
}

如果一个抽象类没有字段,所有方法全部是抽象方法,就可以把抽象类改写为接口interface。

  • Java中使用interface声明一个接口
  • 接口定义的方法默认是public abstract,不需要再写public abstract。
  • 一个类实现interface使用implements
  • 可以实现多个接口
  • 一个interface可以继承自另一个interface

1.1定义接口

public interface Person{
public abstract void run();
}
public class Student implements Person{
@Override
public void run(){}
}
public class Teacher implements Person{
@Override
public void run(){}
}

1.2一个类实现多个接口

public interface Auto{}
public interface Type{}
public class Produce implements Auto,Type{}

1.3一个interface可以继承自另一个interface

interfaces继承自interface使用的extends,相当于扩展了接口的方法

public interface Person{
String getName();
}
public interface Student extends Person{
String getSchool();
}
public class PrimaryStudent implements Person{
@Override
public String getName(){...}
@Override
public String getSchool(){...}
}

1.4.实例

Shape.java

public interface Shape {
//抽象方法,用于计算面积
double area();
//不想在每个类中都实现perimeter方法,可以将该方法定义为default方法
default double perimeter(){
return 0;
};
}

Rect.java

public class Rect implements Shape{
private final double width;
private final double height;
public Rect(double width, double height){
this.height = height;
this.width = width;
}
@Override
public double area() {
return width * height;
}
}

Circle.java

public class Circle implements Shape{
private double radius;
public Circle(double radius){
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}

Hello.java

public class Hello {
public static void main(String[] args){
Shape s1 = new Rect(200,100);//可以用接口类型声明实例
Shape s2 = new Circle(60);
System.out.println(s1.area());
System.out.println(s2.area());
}
}

合理设计interface和abstract class的继承关系
* 公共逻辑放在abstract class
* 接口层次代表抽象程度

2.接口和编程接口的区别

注意区分术语:
* Java的接口特质interface定义的接口,只定义方法签名
* 编程接口泛指接口规范,如方法签名,数据格式,网络协议等

3.抽象类和接口的区别

abstract class interface
继承 只能extends一个class 可以implements多个interface
字段 可以定义实例字段 不能定义实例字段
抽象方法 可以定义抽象方法 可以定义抽象方法
非抽象方法 可以定义非抽象方法,即普通的实例方法 不能定义非抽象方法,但可以定义default方法

4.总结

  • 接口定义了纯抽象规范
  • 类可以实现多个接口
  • 接口也是数据类型,适用于向上转型和向下转型
  • 接口不能定义实例字段
  • 接口可以定义default方法(JDK >= 1.8)

廖雪峰Java2面向对象编程-4抽象类和接口-2接口的更多相关文章

  1. 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类

    每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...

  2. 廖雪峰Java2面向对象编程-3继承和多态-1继承

    1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...

  3. 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础

    1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...

  4. 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类

    1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...

  5. 廖雪峰Java2面向对象编程-6Java核心类-5枚举类

    直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...

  6. 廖雪峰Java2面向对象编程-6Java核心类-4JavaBean

    1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { pr ...

  7. 廖雪峰Java2面向对象编程-6Java核心类-3包装类型

    Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types" ...

  8. 廖雪峰Java2面向对象编程-6Java核心类-2StringBuilder

    字符串操作过程中,每次用 + 拼接字符串,有以下问题: 每次循环都会创建新的对象 绝大部分都是临时对象.浪费内存 影响GC效率 String s = ""; for(int i=0 ...

  9. 廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码

    Java的字符串用String表示 1.String特点: 可以直接使用"..."表示一个字符串,不强制使用new String 内容不可变 String s1 = "h ...

随机推荐

  1. Linux安装模式AppImage,Flatpak,Snap整理

    本文只谈Linux世界用户较多的前2大主要分支, RedHat Red Hat Enterprise Linux 简称RHEL rpm (RedHat, CentOS, Fedora, Oracle. ...

  2. spring管理

    spring管理 SqlMapConfig.xml: <?xml version="1.0" encoding="UTF-8"?> <bean ...

  3. Windows下安装pymssql

    准备用Python接入Sql Server数据库,因此准备用pymssql模块. 安装有点纠结. 64位win10系统,python3.6 步骤: 首先需要配置一下freetds: 在这里下载:htt ...

  4. LG1861 星之器

    题意 题目背景 Magic Land 上的时间又过了若干世纪„„ 现在, 人们谈论着一个传说:从前,他们的祖先来到了一个位于东方的岛屿, 那里简直就是另外一个世界.善于分析与构造的 Magic Lan ...

  5. centos Cannot allocate memory for the buffer pool

    mysql 无法启动 ,查看日志: --01T15::.401599Z [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. P ...

  6. 如何安装psutil以及提示缺少python.h头文件

    下载psutil 下载地址https://pypi.python.org/packages/57/93/47a2e3befaf194ccc3d05ffbcba2cdcdd22a231100ef7e4c ...

  7. MySQL Transaction--两阶段提交事务

    分布式事务两阶段提交 在分布式事务中,需要协调所有分布式原子事务参与者,并决定提交或回滚分布式事务,因此采用两阶段提交协议: 第一阶段为请求阶段或表决阶段,事务协调者通知事务参与者准备提交或取消事务, ...

  8. Visual Studio项目的生成事件代码

    我们打开vs的项目属性可以看到有生成事件,如下图: 可以看到有两块空白区域,这个空白区域可以让我们写代码或脚本来处理编译生成前后的时候,处理一些事情,今天就简单的来说说这两块. 生成前事件命令行 我想 ...

  9. SWF 文件不能本地访问 只有仅限于文件系统的 SWF 文件

    http://blog.163.com/vituk93@126/blog/static/1709580342012512112757505/ SWF 文件不能被本地访问 不能访问本地 只有仅限于文件系 ...

  10. mysql——创建索引、修改索引、删除索引的命令语句

    查看表中已经存在 index:show index from table_name; 创建和删除索引索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER ...