抽象类和接口
1、抽象类
类的层次结构中,越往下继承的子类其属性和方法越来越具体。相反,越上层的祖先类其实现越抽象,甚至无法给出具体实现。例如,一个圆或矩形有面积,但祖先几何图形类的getArea()方法没法给出具体实现,这时可以定义为抽象方法。
Java中可以定义不含方法体的方法,方法的方法体由该类的子类根据自己的情况去实现,这样的方法称为抽象方法(abstract method),抽象方法的声明必须加上abstract关键字。包含抽象方法的类必须是抽象类(abstract class)。抽象类的声明必须加上abstract关键字。
抽象类和抽象方法的声明要加上abstract关键字。
抽象类的几点说明
(1)抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。换句话说,抽象类扩展的非抽象子类中,必须实现所有的抽象方法。
(2)抽象方法是非静态的。(只有实例方法可以声明为抽象方法。)
(3)不能使用new操作符来实例化抽象类。但仍然可以定义它的构造方法,这个构造方法被它子类的构造方法中调用。
(4)包含抽象方法的类必须是抽象的。但是,可以定义一个不包含抽象方法的抽象类。在这种情况下,不能使用new操作符创建该类的实例。这种类是用来定义新子类的父类的。
(5)抽象类的父类可以是具体类。即使子类的父类是具体的,这个子类也可以是抽象的。
(6)子类可以重写父类的方法并将它定义为abstract。这是很少见的,但是它在当父类的方法实现在子类中变得不合法时是很有用的。在这种情况下,子类必须被定义为abstract。
(7)不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以被用作一种引用变量的数据类型。
抽象类的用意:抽象类只能用来被继承,或用来声明引用变量,不能实例化。
抽象方法的用意:模板方法,推迟到子类中实现的方法。
2、接口
接口是常量和抽象方法定义的集合。接口在许多方面都与抽象类很相似,但是它的目的是指明多个对象的共同行为。
语法
修饰符 interface 接口名 {
常量声明
抽象方法声明
}
接口体中的常量隐式地声明为 public static final
接口体中的方法隐式地声明为 public abstract

接口中的方法通过“接口类型的引用变量.方法名”访问,但接口类型的引用变量必须指向实现了该接口的类的实例对象。
接口中的常量名通过“接口名.常量名”访问。
使用接口
可以在能够使用任何其他数据类型的地方使用接口。
接口类型属于引用类型,接口类型的变量可以存储:
空引用(null)
任何实现该接口的类的实例的引用
类实现接口的语法
修饰符 class 子类名 [extends 父类名]
[implements 接口名列表 ] {
成员声明
}
除非类被声明为abstract,所有父接口中声明的成员方法必须被实现。一个类只能继承一个父类,但可以实现多个接口,多个接口以“,”分开。
如果接口声明中提供了extends子句那么该接口就继承了父接口的方法和常量。
任何实现该接口的类,必须实现该接口继承的其他接口。
3、是使用接口还是类?
抽象类和接口都是用来建模对象的共同特征。那么该如何确定在什么情况下使用接口,什么情况下使用类呢?一般来说,详细描述父子关系的强是关系(strong is-a relationship)应该用类建模。例如:职员是人,所以他们的关系是用类继承建模的。弱是关系(weak is-a relationship)也称为类属关系(is-kind-of relationship),它表明对象拥有某种属性。弱是关系可以用接口来建模。例如:所有的字符串都是可比较的,因此,String类实现Comparable接口。如果需要多重继承的话,您还可以使用接口来规避单继承的限制。在多重继承的情况下,你必须设计一个超类,而其它作为接口。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗