abstract和接口
abstract(抽象类)
-
-
抽象类通过其子类实例化
-
用abstract修饰的类就是抽象类。抽象方法必须定义在抽象类中。但是抽象类中不一定有抽象方法
-
抽象类可以继承普通类与抽象类。
-
abstract与其他修饰符的关系:
final与abstract不能共存:
final:它的作用 修饰类代表不可以继承 修饰方法不可重写
abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。
final与 static不能共存
staic修饰的方法可以用类名调用(子类不能重写),对于abstract修饰的方法没有具体的方法实现,所以不能直接调用,也就是说不可以与static共存。
final与private不能共存
接口(interface)
作用:Java不支持多继承,Java将多继承机制进行改良变成了多实现,可以弥补Java中单继承的缺点 。
-
-
接口不可以被实例化
-
实现了接口的实现类必须重写接口中所有抽象方法后,这个子类才可以被实例化,否则报错。
-
一个类可以实现多个接口,多个接口用逗号分隔,也可以不实现接口。
-
一个类在继承另一个类同时,还可以实现多个接口
- 接口中的成员修饰符是固定的:
-
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错),所以不能含有静态代码块以及静态方法(用 static 修饰的方法)
类实现接口的实例:
//接口 public interface Pencil{ // double PI=3.14; // public static final double PI=3.14; //静态常量,值一旦定义就不可以修改 public abstract void write(); //抽象方法 } //接口 public interface Eraser { public abstract void remove(); //清除的抽象方法 } //可擦铅笔 实现多个接口 public class PencilWithEraser implements Pencil,Eraser{ //重写抽象方法 @Override public void remove() { System.out.println("可以擦除文字"); } //重写抽象方法 @Override public void write() { System.out.println("正在写文字......"); } } public class PencilWithEraserTest { public static void main(String[] args) { // PencilWithEraser pwe = new PencilWithEraser(); // pwe.write(); // pwe.remove(); //类实现多个接口,使用接口类型接收new的对象,会出现 有的接口类型没有对应方法,进行强转对应的接口类型,常用的方法之一 Pencil pwe = new PencilWithEraser(); pwe.write(); //不能调用 因为Pencil接口类型没有remove方法 //pwe.remove(); //强转成 Eraser 接口类型 Eraser eas = (Eraser) pwe; eas.remove(); } }
接口和接口的关系:接口与接口之间是继承关系,而且可以多继承
实例:
//人类接口 public interface Person { public abstract void say(); //说的抽象方法 } public class Chinese implements Person{ //重写接口中的抽象方法 @Override public void say() { System.out.println("说中文"); } } public class American implements Person{ @Override public void say() { System.out.println("说英文"); } } public class PersonTest { public static void main(String[] args) { //使用接口做为类型,不再使用具体实现类作为类型, 但 new 还是要使用实现类 //也是多态的表现之一 Person chinese = new Chinese(); chinese.say(); Person american = new American(); american.say(); } }
在Java中接口是一个比抽象类更加抽象的概念,由于只声明行为,因此在接口中的方法均是抽象的,下表中罗列了接口和抽象类的差异:
abstract class | interface | |
---|---|---|
属性 | 不用限制 | public 静态 final 常量 |
构造方法 | 可有可无 | 没有 |
普通方法 | 可以有具体方法 | 必须是public抽象方法 |
子类 | 单一继承 | 多重实现(接口继承接口时为多重继承) |
-
-
接口体现实现关系,一个类可以多实现
-
抽象类是继承 is a关系 (所属关系)在定义该体系的基本共性内容
-
-
-
不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A无法确定该继承那一个
-
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话