廖雪峰Java2面向对象编程-4抽象类和接口-2接口
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接口的更多相关文章
- 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类
每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...
- 廖雪峰Java2面向对象编程-3继承和多态-1继承
1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...
- 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础
1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...
- 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类
1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...
- 廖雪峰Java2面向对象编程-6Java核心类-5枚举类
直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...
- 廖雪峰Java2面向对象编程-6Java核心类-4JavaBean
1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { pr ...
- 廖雪峰Java2面向对象编程-6Java核心类-3包装类型
Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types" ...
- 廖雪峰Java2面向对象编程-6Java核心类-2StringBuilder
字符串操作过程中,每次用 + 拼接字符串,有以下问题: 每次循环都会创建新的对象 绝大部分都是临时对象.浪费内存 影响GC效率 String s = ""; for(int i=0 ...
- 廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码
Java的字符串用String表示 1.String特点: 可以直接使用"..."表示一个字符串,不强制使用new String 内容不可变 String s1 = "h ...
随机推荐
- GinKgoCTF-Crypto
一:古典密码 一只小羊跳过了栅栏,密码如下: GpKlCeT_FC{rAy_pStiym} 栅栏解密——>11栏 二:滴滴滴 --./-.-/-.-./-/..-./----.--/-../.. ...
- java 调用process
java调用process 有两种实现方法,一是使用Runtime类,二是使用Process类. 我在最近的项目里用的是Runtime类,接下来写下总结. 有图有真相(在网上学来一句话) packag ...
- debian 安装使用NTP
编程之路刚刚开始,错误难免,希望大家能够指出. 领导要求,要4台机器时钟同步,上网查了查,主要看了看ptp和ntp,感觉ntp就够用,索性就直接上手ntp了. 以下内容纯属最基础的内容,只适合第一次接 ...
- python英文与中文的词频统计
1.统计英文单词, # 1.准备utf-8编码的文本文件file(已在文件夹中定义了 一个名叫“head.txt.rtf”文本文件,详情请见截图) def getTxt(): #3对文本预处理(包括) ...
- Go Example--变量
package main import "fmt" //通过import导入fmt标准包 func main() { //定义变量,并初始化 var a string = &quo ...
- 【vue】vue前端项目结构
[一]项目结构 [二]项目结构释意 目录/文件 说明 build 项目构建(webpack)相关代码 config 配置目录,包括端口号等.我们初学可以使用默认的. node_modules npm ...
- LG5056 【模板】插头dp
题意 题目背景 ural 1519 陈丹琦<基于连通性状态压缩的动态规划问题>中的例题 题目描述 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 输 ...
- Unity 资源的优化管理 学习
- WinForm中执行JS代码(多种方法)
方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址 http://www.microsoft.com/downloads/details ...
- ML(5)——神经网络2(BP反向传播)
上一章的神经网络实际上是前馈神经网络(feedforward neural network),也叫多层感知机(multilayer perceptron,MLP).具体来说,每层神经元与下一层神经元全 ...