【java基础】-- java接口和抽象类的异同分析
- 在java中,通常初学者搞不懂接口与抽象类,这也是面试比较容易问到的一个问题。下面我来谈谈自己的理解。如有不妥之处,还望批评指正,不胜感激。
1.抽象类怎么定义和继承?
我们定义一个抽象类person.class表示类(人):
//使用关键字abstract
public abstract class person {
//吃东西的抽象方法,已经有所实现
public void eat(){
System.out.println("我是抽象方法吃东西");
}
//public 修饰的空实现的方法
public void run(){}
//无修饰,空实现
void walk(){}
//protected修饰的方法,空实现
protected void sleep(){}
//private修饰的空实现方法
private void read(){}
}
- 1.抽象类使用abstract修饰,可以有抽象方法,也可以完全没有抽象方法,也可以是实现了的方法,但是所有的方法必须实现,空实现(
public void walk(){})也是实现的一种,而不能写public void eat(),后面必须带大括号。 - 2.方法修饰符可以使
public,protected,private,或者是没有,没有默认为只能在同一个包下面继承,如果是private那么子类继承的时候就无法继承这个方法,也没有办法进行修改. - 下面我们来写一个
Teacher.class继承抽象类
同一个包下继承:

不同的包下面继承:

同个包下正确的代码如下(不重写私有的方法):
public class teacher extends person {
@Override
public void run(){
System.out.println("我是实体类的方法跑步");
}
@Override
void walk(){
System.out.println("我是实体类的方法走路");
}
@Override
protected void sleep(){
System.out.println("我是实体类的方法睡觉");
}
}
- 结果如下(没有覆盖抽象类吃东西的方法,所以会调用抽象类默认的):

- 下面代码是重写了
eat()方法的代码,重写是即使没有使用@Override也是起作用的:
public class teacher extends person {
public void eat(){
System.out.println("我是实体类的方法吃东西");
}
@Override
public void run(){
System.out.println("我是实体类的方法跑步");
}
@Override
void walk(){
System.out.println("我是实体类的方法走路");
}
@Override
protected void sleep(){
System.out.println("我是实体类的方法睡觉");
}
}
结果如下,吃东西的方法被覆盖掉了:

抽象类不能被实例化,比如:

子类可以实现抽象类的方法,也可以不实现,也可以只实现一部分,这样跑起来都是没有问题的,不实现的话,调用是默认使用抽象类的空实现,也就是什么都没有输出,要是抽象类有实现,那么会输出抽象类默认方法。
比如:


- 抽象类中可以有具体的方法以及属性(成员变量)
- 抽象类和普通类之间有很多相同的地方,比如他们都可以都静态成员与静态代码块等等。
2.接口怎么定义和实现?
- 接口就是对方法或者动作的抽象,比如
person.class想要成为教师,可以实现教师的接口,可以理解为增加能力。- 接口不允许定义没有初始化的属性变量,可以定义
public static final int i=5;,以及public int number =0;,但不允许public int num;这样定义,所有private的变量都不允许出现,下面是图片

定义public int number =0;默认是final修饰的,所以也不能改变它的值:

下面是正确的接口代码:Teacher.java
public interface Teacher {
public static final int i=5;
public int number =0;
public void teach();
void study();
}
- 实现类TeacherClass.java
public class TeacherClass implements Teacher{
@Override
public void teach() {
System.out.println("我是一名老师,我要教书");
System.out.println("接口的static int是:"+i);
}
@Override
public void study() {
System.out.println("我是一名老师,我也要学习");
System.out.println("接口的int number是:"+number);
}
}
- 测试类Test.java
public class Test {
public static void main(String[] args){
TeacherClass teacherClass = new TeacherClass();
teacherClass.study();
teacherClass.teach();
System.out.println("-----------------------------------------------------");
Teacher teacher =teacherClass;
teacher.study();
teacher.teach();
}
}
结果:

分析:接口里面所定义的成员变量都是final的,不可变的,实现接口必须实现接口里面所有的方法,不能只实现一部分,没有使用static final修饰的,默认也是final,同时必须有初始化的值,接口不能直接创建对象,比如Teacher teacher = new Teacher() ,但是可以先创建一个接口的实现类,然后再赋值于接口对象。
3.总结与对比
| 抽象类 | 接口 |
|---|---|
使用关键字abstract修饰 |
使用关键字interface |
使用关键字extends实现继承,可以只实现一部分方法,一部分不实现,或者不实现也可以 |
implements来实现接口,实现接口必须实现里面都有的方法 |
| 抽象类里面的方法可以是空实现,可以默认实现,但是必须要带{} | 接口里面的方法都没有实现体,也就是{} |
| 抽象类中可以有具体的方法以及属性,也可以有静态代码块,静态成员变量 | 接口里面不能有普通成员变量,必须都是不可变的final成员变量,而且所有的成员变量都必须是public |
抽象类里面的方法可以是public,protect,private,但是private无法继承,所以很少人会这么写,如果没有修饰符,那么只能是同一个包下面的类才能继承 |
接口的方法只能是public或者无修饰符,所有的private修饰都是会报错的 |
| 如果有改动,添加新的方法,可以直接在抽象类中实现默认的即可,也可以在实现类中实现 | 接口增加新方法必须在接口中声明,然后在实现类中进行实现 |
| 抽象类不能直接创建对象 | 接口也不能直接创建对象 ,可以赋予实现类的对象 |
抽象类可以有main方法,而且我们可以直接运行,抽象类也可以有构造器 |
接口不能有main方法,接口不能有构造器 |
那么我们什么时候使用接口什么时候使用抽象类呢?
- java有一个缺点,只能实现单继承,个人觉得接口是为了弥补单继承而设计的。
- 接口是对本质的抽象,比如人,可以设计为
person.class这个抽象类,提供相关的方法,属性,但是接口是只提供方法的,也就是像增加功能的,那么也就是对方法的抽象。- 如果需要默认实现,或者基本功能不断改变,那么建议使用抽象类,如果只是增加一种方法,那么建议使用接口,如果想实现多重继承,只能是接口与抽象类一起使用以达到想要实现的功能。
本文章是初学时的记录,仅是初级的对比,深入学习还需各位保持Keep going~
此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~
技术之路不在一时,山高水长,纵使缓慢,驰而不息。Keep going~
公众号:秦怀杂货店

【java基础】-- java接口和抽象类的异同分析的更多相关文章
- 【Java基础】接口和抽象类之间的对比
Java 中的接口和抽象类之间的对比 一.接口 Interface,将其翻译成插座可能就更好理解了.我们通常利用接口来定义实现类的行为,当你将插座上连接笔记本的三角插头拔掉,换成微波炉插上去的时候,你 ...
- Java基础之接口与抽象类及多态、内部类
final关键字 被其修饰的类,不能被继承. 被其修饰的方法,不能被覆盖. 被其修饰的变量,是一个常量,不能被修改,所以定义时必须初始化(和C++的const类似). 一般有final,会搭配stat ...
- Java基础——关于接口和抽象类的几道练习题
呃,一定要理解之后自己敲!!!这几道题,使我进一步了解了接口和抽象类. 1.设计一个商品类 字段: 商品名称,重量,价格,配件数量,配件制造厂商(是数组,因为可能有多个制造厂商) 要求: 有构造函数 ...
- Java基础(四)--接口和抽象类
接口和抽象类能够体现OOP的抽象,而接口和抽象类也是日常开发中经常用到的 抽象方法: 抽象方法就是被abstract修饰的方法,只有声明,没有实现,也就是没有方法体 public abstract v ...
- java基础之接口(抽象类与接口的区别)
概述 猫狗案例,我们想想狗一般就是看门,猫一般就是作为宠物了,对不.但是,现在有很多的驯养员或者是驯的,这应该属于经过特殊的培训训练出来的,对不.所以,这些额外的动作定义到动物类中就不合适,也不适合直 ...
- 【java基础】接口VS抽象类
1.至少有一个被abstract修饰的方法,同时修饰类名的类为抽象类,抽象的方法必须被子类覆盖,抽象的类必须被继承,抽象的类可以包含非抽象方法,只能单继承. 2.接口中所有的变量是static fin ...
- 30.Java基础_接口_抽象类_具体类实现案例
public interface SpeakEnglish { public abstract void speak(); } public abstract class Person { priva ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
- 浅谈Java中接口与抽象类的异同
浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...
- Java基础十--接口
Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...
随机推荐
- 动态规划——详解leetcode518 零钱兑换 II
动态规划 零钱兑换 II 参考书目:<程序员代码面试指南:IT名企算法与数据结构题目最优解> 给定不同面额的硬币和一个总金额.写出函数来计算可以凑成总金额的硬币组合数.假设每一种面额的硬币 ...
- Goby 漏洞发布|泛微 e-cology v10 appThirdLogin 权限绕过漏洞【漏洞复现】
漏洞名称:泛微 e-cology v10 appThirdLogin 权限绕过漏洞 English Name:Weaver e-cology v10 appThirdLogin Permission ...
- TypeScript 学习笔记 – Handbook 1
前言 一转眼, 一年多没有写 TypeScript 了. 最近又要开始写了, 乘此机会打算系统学习一下, 顺便写一个学习笔记. 我接触 TypeScript 比较早, 那是 Angular 2 bet ...
- 从零开始掌握 Kubernetes:Pod 和 Deployment 的幕后故事
1. 引言 在如今的技术世界中,随着微服务架构的广泛应用和云原生理念的兴起,应用程序的开发.部署和管理发生了翻天覆地的变化.容器技术的出现使得开发者可以轻松地将应用及其所有依赖打包在一个轻量级.可移植 ...
- 学好QT框架之后可以做什么工作?QT技术框架现代化行业大型复杂应用的经典成功案例
简介 本文粗略的介绍了QT框架的软件开发技术生态体系的全球影响力:QT框架在文字办公领域.CAD三维图形领域.Linux操作系统领域.物联网领域.汽车电子领域以及数字医疗领域等现代化行业的大型复杂应用 ...
- 信创环境经典版SuperMap iManager监控外部SuperMap iServer资源失败,无法监控目标GIS服务器CPU与内存使用情况
一.问题环境 操作系统:银河麒麟kylin V10 CPU:鲲鹏920 SuperMap iServer 10.2.0 SuperMap iManager 10.2.1 二.现象 部署完经典版Supe ...
- 腾讯自研Git客户端,助力每个人都可以轻松使用Git
工具介绍 UGit是一款腾讯自研的Git客户端,为了让每个人都可以轻松使用Git,从而提高开发效率和团队协作的流畅性.支持工蜂MR/CR,工蜂议题管理,另外对于Git的原生特性有着深度支持. 支持的系 ...
- webapi action 参数
使用地址参数传递(queryString)数据:eg:http://localhost:5063/WeatherForecast?age=123 /// <summary> /// GET ...
- kotlin协程——>共享的可变状态与并发
共享的可变状态与并发 协程可⽤多线程调度器(⽐如默认的 Dispatchers.Default)并发执⾏.这样就可以提出所有常⻅的并发 问题.主要的问题是同步访问共享的可变状态.协程领域对这个问题的⼀ ...
- getshell后的基本信息收集
基本信息收集 系统类型判断 使用whoami能快速判断系统是Linux还是Windows. 如果是Windows, 使用命令systeminfo | findstr OS可得到WIndows版本. 使 ...