Java比较抽象类与接口的异同
一.抽象类(一)概念
在继承的层次结构中,每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追溯,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类(abstract class)。在类的头部使用 abstract 修饰符表示该类为抽象类。 (二)抽象类和抽象方法
同样用 abstract 声明抽象方法。抽象方法(abstract method)只定义成员方法的接口形式,而没有具体操作。只有派生类对抽象成员方法的重定义才能真正实现与该派生类相关的操作。在各子类继承了父类的抽象方法之后,再分别用不同的语句和方法体来重新定义它,形成若干个名字相同、返回值相同、参数列表相同、目的一致但是具体实现有一定差别的方法。抽象类中定义抽象方法的目的是实现一个接口,即所有的子类对外都呈现一个相同名字的方法。
1.一个包含抽象方法的类必须声明为抽象类
几点说明: 抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类。 即使子类的父类是具体的,这个子类也可以是抽象的。 当父类的方法实现在子类中变得无效时,子类可以重写父类的方法并将它定义为抽象的。
2.抽象方法只有定义而没有实现,它的实现由子类提供
下面定义了一个抽象类Object类:
public abstract class Object {
public abstract double getArea();
public abstract double getPerimeter();
}
Object类是多个子类的父类,由于在多个子类中都要用到getArea()方法和getPermeter()方法,所以在父类中定义比较好;由于计算面积和周长的getArea()方法和getPermeter()方法在不同子类里的实现方式不同,所以Object类中定义的这两个方法的实现只能由子类提供。
3.抽象类无法被直接实例化,可以让子类继承然后实例化子类
通过一个例子来说明:
public abstract class Person {
//定义一个抽象方法
public abstract void isSmoke();
}
//学生类
class Students extends Person{
//继承抽象类后抽象类中的抽象方法必须在子类中实现
public void isSmoke() {
System.out.print("Students can"t smoke.");
}
}
//教师类
class Teachers extends Person{
public void isSmoke() {
System.out.print("Teachers can smoke.");
}
} (三)使用抽象类的意义
因为抽象类不能实例化对象,必须要有子类来实现它之后才能使用。这样就可以把一些具有相同属性和方法的组件进行抽象,更有利于代码和程序的维护。同时,抽象类也是Java面向对象的一个重要体现。 二.接口(一)概念
接口(Interface),在Java编程语言中是一个抽象类型,是象方法的集合。
接口通常以 interface 来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口有以下特性: 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。 接口中的方法都是公有的。 (二)语法
1. 定义: 一个简单的接口拥有全局变量和抽象方法。在接口中的所有方法都必须只声明方法标识,而不要去声明具体的方法体,因为具体的方法体的实现是由继承该接口的类来去实现的。
接口定义的一般形式为:
[访问控制符]interface <接口名> {
类型标识符final 符号常量名n = 常数;
返回值类型 方法名([参数列表]);
…
}
定义接口实例:
interface Human {
//定义一个全局变量
final String txt="吸烟有害健康";
//定义一个抽象方法
public void isSmoke();
}
2.实现: 要实现接口,就必须去实现接口规定的方法,只有把接口规定的抽象方法都给实现了,才承认这个类实现了这个接口,实现了这个接口代表的某种功能。使用 implements 关键字实现接口。
实现接口实例:
class Student implements Human{
public void isSmoke() {
System.out.println("Students can"t smoke.");
}
public static void main(String[] args) {
Student h=new Student();
h.isSmoke();
System.out.println(txt);
}
}
3.接口的继承
子接口可以对父接口的方法和常量进行重写。例如:
// 接口 Student 继承 Human
public interface Student extends Human {
// 重写父接口中的txt
String txt = "未成年禁止吸烟";
// 重写父接口中的isSmoke()方法
void isSmoke();
}
注意: 在Java中,类的多继承是不合法的,但接口允许多继承。
public interface C extends A, B 三.比较抽象类与接口Q: 为什么有了抽象类还要接口?
看起来抽象类除了多继承以外,完全可以完成接口所作的事情,为什么还需要定义接口呢? 避免java单继承的局限 避免多继承带来的复杂性和低效性 面向接口编程带来的优势。降低程序间的耦合,易扩展,易维护 Q: 如何确定在什么情况下应该使用接口,什么情况下应该使用类呢?
抽象类和接口都是用来指定多个对象的共同特征的。那么如何确定在什么情况下应该使用接口,什么情况下应该使用类呢?一般来说,清晰描述父子关系的强的"是......的一种"关系应该用类建模。弱的"是..的一种"关系也称为类属关系,它表明对象拥有某种属性,可以用接口来建模。
在这台iPhone面前,iPhone13一点也不香如果你的预算是6000,你会选择哪一款iPhone?是新品iPhone13还是老款旗舰机?网友入手了iPhone12ProMax512GB,只花了6150元。他觉得iPhone12
进入布展阶段!第四届进博会首批展品今日进场(ChinaIT。com讯)Handinhandwestand,allacrosstheland(我们手拉手,友谊传四方)10月23日上午11时5分,国家会展中心(上海)北广场气氛
中国乔丹判赔美国乔丹35万?关注每天热搜的朋友大概对乔丹商标侵权案件多少都知道一些当大家都在狂欢倒数2021的到来这起商标侵权案终于也是有点眉头!乔丹体育被判赔35万并公开道歉不说别的,飞人乔丹想必不懂篮球的
挑选游戏本,为啥散热性能看得非常重?玩游戏成了很多人的日常,但是在选择游戏本的时候,却遇到了困难。因为自己是小白,所以不懂如何挑选一款合适自己的笔记本。那么应该如果挑选一款适合自己的游戏本呢?其实只要看重价格用途硬件
RTX30系显卡游戏本批量上线,应该如何选购?RT30系显卡游戏本上线已经有一段时间,而最近更是批量上线,如果手头的游戏本刚好需要更换,那么现在是时候入手新款了,毕竟上线游戏本多了,挑选起来,才有性价比和非性价比之分。那么应该
双11看点天猫爱吆喝京东疲软苏宁迅猛国美不争气今年的双11是越来越热闹了,由去年的天猫和京东,逐渐出来了更多新的面孔,如苏宁国美,但是在双11的推广策略中,苏宁应该是最成功的一家,在双11的前半个月中,甚至截止到目前为止,苏宁
亿万网友群殴联想,到底谁说的对?这两天,联想投票门和被扣政治帽子的事件持续发酵,做为一个理性的网友,看到朋友圈的各种联想文章,纷至踏来,一个接一个好不精彩。正方是联想,反方是亿万网友,从目前的情况来看,反方的文章
没有狼性的联想它的冤屈与堕落联想被扣帽子的事件不断得到发酵,联想的老爷子不得不出来,发了一封内部信行动起来,誓死打赢联想荣誉保卫战。不得不说联想老爷子的厉害,一呼百应,一群中国大公司的大佬为其呐喊助威,还有很
凌晨三点不回家,写你苦逼的文章总能十万一觉醒来,又一篇文章凌晨3点不回家成年人的世界是你想不到的心酸刷屏了,看见了很多大佬都在转,心里想,连这些大佬都逃避不了这些贩卖焦虑和苦逼的鸡汤。同样的选题,同样的套路,同样的鸡汤
前端CSS学习笔记旋转轮播图效果的实现自动旋转轮播图,无限循环1实现效果图代码!DOCTYPEhtmlhtmllangenheadmetacharsetutf8stylebody指定观察者与z0平面的距离,使具有三维位
前端CSS学习笔记旋转头像效果实现效果视频视频加载中实现代码!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8titletitlestyle。txspanimg设置对象使用圆角边