0

0

Java 抽象类与接口

伊谢尔伦

伊谢尔伦

发布时间:2016-12-05 13:34:21

|

1154人浏览过

|

来源于php中文网

原创

java 抽象类

我们父类设定了一些方法,设定的主要目的是让子类继承父类去覆写那些方法,来展示不同的结果。换句话说,我们不关心父类方法里的具体实现,反正会被子类的方法覆写,那么我们就可以让父类更抽象一下,抽象到只有方法的声明,而没有方法体。我们管这种方法叫做抽象方法,管包含抽象方法的类叫做抽象类。

抽象类的特点

抽象类里只要含有一个或者一个以上的抽象方法就是抽象类,但如果一个抽象方法都没有,那这个抽象类也没有建立的意义。抽象方法是具有如下格式的方法

[public] abstract 返回类型 方法名(参数列表); 
抽象方法是没有方法体的 ,所以方法名写完就会加;表示方法声明结束,抽象法方法体用abstract修饰,表示这是一个抽象的方法,访问修饰符只能用public或者是protected,或者是默认访问权限,就是不能用private,因为根本无法去继承 
同样,抽象类的格式如下:

立即学习Java免费学习笔记(深入)”;

[public] abstract class 类名{
    [public] abstract 返回类型 方法名(参数列表);
}

抽象类的是前面加abstract修饰,表示这个是一个抽象类,访问修饰符只能用public或者是protected,或者是默认访问权限,不能用private的原因和上面一样。 
抽象类创造的意义是将方法的声明与方法的实现分隔开,从而实现多态。那么他就具有如下的特点:

抽象类不能被实例化,也就是说不能直接创建一个抽象类的对象,但抽象类是可以有构造函数的,如果是有参构造函数,则子类要去显示调用它。 
抽象类是用来被继承的,方法是要被覆写的,如果子类继承了抽象的父类,则需要覆写父类的抽象方法,如果没有覆写,则子类必须也要定义为抽象类。 
abstract是不能与private static,final 修饰符一起使用来修饰方法。

这里我们解释一下第三点,abstract不能与private一起用,因为private修饰的方法和类,都是无法再类之外被访问到。也就没有继承的可能性。abstract不能和static一起用,是因为abstract的作用是实现多态,而实现多态则依赖于继承和覆写。static修饰的方法虽能被子类所继承,但是我们修改了继承后的方法时,这个就不能算作是覆写,而是父类的方法被隐藏掉了,只有通过父类名.方法名的形式显示调用它,这个实现不了多态。从另一个角度来看,静态的方法是编译的时候就确定了,无法实现后期绑定,也就不存在运行时在决定方法调用的可能。所以static修饰的方法是可以被继承,但无法实现多态,自然也就不能和abstract一起使用。 
abstract不能和final一起使用的原因和上面一样,final修饰的方法无法被继承,自然也谈不上多态,所以abstract无法和final一起用。

抽象类举例

我们把上文多态的例子,继续修改,抽象化。我们把Animal的代码改成如下样子。

public abstract class Animal {    
  abstract void run();
}

我们Dog,Cat类的代码不需要改变。

public class Dog extends Animal{
    @Override
    public void run() {
        System.out.println("狗在奔跑");
    }
}public class Cat extends Animal{
    @Override
    public void run() {
        System.out.println("猫在奔跑");
    }
}

其他Print类,和Test类的代码也保持不变,代码如下:

public class Print {    
    public void print(Animal animal) {
        animal.run();
    }
}
public class Test {    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();        
        new Print().print(dog);        
        new Print().print(cat);
    }
}

我们可以看出抽象类和之前普通类,在其他地方的改动基本是没有的,只是将方法变得抽象,意义上更加明确。

抽象总结

天天团购系统
天天团购系统

天天团购系统是一套强大的开源团购程序,采用PHP+mysql开发,系统内置支付宝、财付通、GOOGLE地图等接口,支持短信发送团购券和实物团购快递发货等;另外可通过Ucenter模块,与网站已有系统无缝整合,实现用户同步注册、登陆、退出。 天天团购系统是一套创新的开源团购程序,拥有多达10项首创功能,同时支持虚拟和实物团购,内置类似淘宝的快递配送体系,并提供强大的抽奖、邀请返利等营销功能,让您轻松

下载

创建抽象类和抽象方法是很有意义的,他能让我们设计类的时候使类的含义更加明确,通过抽象的思想,让类变得更加通用,声明一系列的方法来告诉用户打算怎么去使用它。

Java 接口

接口可以看出一种协议,一种要求,我们继承他来知道我们可以做什么,具体怎么做则取决与我们。比如KFC就是一个接口,我们一看他就知道里面有买汉堡,炸鸡,可乐,但是具体的味道和服务又会根据不同的店,有不同的样子,这就是接口的意义。所以我们这里也可以看出接口里的方法也应该是抽象的。

接口的特点

Java中接口的写法如下:

[public] interface InterfaceName {
         成员变量
         方法声明
}

接口区别于类,他不是用class来修饰,他用特定的interface关键字,访问修饰符与class一致,可以用public或者缺省。里面只有抽象方法和成员变量两种内容。成员变量会默认添加public static final意为成员变量归类所有,访问权限是最大的,但是不能别继承和修改。这也看出接口是因为不能被实例化,才会这样约定的,接口的成员变量不允许为空,在定义的时候就要赋值给他。 而接口的方法则默认为抽象方法,默认添加public abstract和抽象方法一样,只能写方法声明。 
不同于我们用extends去继承一个类,我们用implements 来表示实现这个接口。

class ClassName implements Interface1{
}

接口作为一个特殊的存在,是有一些他的独特的地方的。

一个类是可以实现多个接口的,这在一定程度上实现了Java的多继承。 
接口是不能被实例化,不同于抽象类,接口的内部只能由成员变量和抽象方法,是不可以存在静态变量块,以及构造器的。 
我们是可以声明一个接口类型的变量,但是只能引用一个实现了这个接口的类。 
同抽象方法,实现了接口的类必须实现接口的所有方法,否则就会变成抽象类。 
接口举例

看过抽象的例子,我们可能想,我们把Animal从抽象换成接口,不就实现了一个接口的例子嘛,其他地方基本也不用去改动。但这显然是错的。我们并不能去说Animal是一个接口,我们上面说了,接口是一种协议,规定我们能做什么,而不是一个事物的抽象。从这里我们也能看出接口和抽象的不同,抽象更多的是一种重构而产生的东西,我们先有dog,cat类,然后才会把他们共性的东西提取出来,放到一个更通用,更抽象的父类Animal中,而我们发现Animal不需要管run方法是怎么实现的,所以我们将run方法设定为抽象的方法,从而将Animal类设为抽象类,等待去=继承者来实现run。这是一种从下而上的设计思想。但是接口不是,接口一开始就是设定好的,我们根据设定好的接口从上往下去写。接口先规定好了有什么方法,然后我们再去具体实现他。这是一种从上而下的设计思想。 
所以,我们不能将Animal设为接口,但是我们可以将Print设为接口,他规定我们有一个print()方法,代码如下:

public interface Print {    
  void print(Object obj);
}

那我们就可以写一个新的类去实现这个Print接口。代码如下:

public class SimplePrint implements Print{
    @Override
    public void print(Object obj) {
        ((Animal)obj).run();
    }
}

除了Test类以外,其他地方都不需要改变。我们Test类代码如下:

public class Test {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();        
        Print print = new SimplePrint();        
        print.print(dog);        
        print.print(cat);
    }
}

接口总结

接口和抽象虽然都是通过抽象的方法来提供我们实现多态的方式,但是他们却是两个不同的设计思想。这里关于接口的讲解比较简单,关于接口自身的继承,接口内部包含其他接口,以及利用接口来实现回调等等留在以后的文章专门来说。这里主要是通过对比来了解抽象和接口。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

178

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

35

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

79

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

122

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

72

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.8万人学习

Java 教程
Java 教程

共578课时 | 52.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号