抽象类abstract与接口interface区别代码实战演示——观止

本文主要是介绍抽象类abstract与接口interface区别代码实战演示——观止,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请自己阅读以下代码,每个修饰符我都仔细斟酌写上去的,都很有考究。

笔者为了写好这篇文章,查阅了很多相关资料,以求总结地准确和全面,花了很多工夫,希望大家珍惜。

把这些代码读懂了,抽象类与接口的区别你就过关了。

你能通过这些代码很直观地总结出所有抽象类和接口的性质及区别,面试这个知识点基本逃不过下面的代码。

为什么我只放代码,不直接写出结论让大家直接观阅呢?

因为你直接看结论,记不住!!!过两天你就忘记了。这东西本来没可遵循的规律,记忆点还多,如果你不懂底层源码那忘记更快。

你可以对着我亲自实验的代码,自己总结规律。

最好的办法,是把这些代码拿走,自己动手实验,再总结,这样印象更深刻。

建议收藏本文以便时不时实践、复习一下。

等你熟悉到一定程度,只需浏览、对比一下代码就能迅速想起来所有的区别点。

以下所有测试基于jdk1.8,且所有类在IDEA里都不报错。

抽象类: 

//抽象类不能用final、private、static修饰
public abstract  class TestAbstract {//可以有有参和无参构造器,但必须有方法体public TestAbstract() {}public TestAbstract(String s,int d){this.s = s;this.d = d;}public String s;//成员属性不可定义为abstractprivate int d;//可为privateprivate  static int ds;//静态属性可不初始化private final static int q = 0;//final修饰必须初始化//可以有静态块static {
//        public int d;//不能为public
//        private String as;//不能为private
//        protected int b;//不能为protected
//        static int d = 0;//不能为staticint a;//可不初始化}//private修饰时只能带方法体,不能转为抽象方法,即abstract不能与private、static、final共存private String abs() {return null;}
//    public String abp() ;//public修饰时要么抽象方法要么有方法体//    private abstract String pa();//不能是私有抽象方法//抽象方法必无方法体,且可没有抽象方法,abstract不能与private、default、static、final共存protected abstract  String pa();//static 不能与abstract、default共存,且必带方法体private static String pas() {return null;}//可以final修饰private final static String psv() {return null;}
//不能有default修饰的方法/*default String hu() {return null;}*///final不能与default共存private final int f() {return 0;}//内部抽象类可以用static、private修饰,但是不能用final修饰,抽象类可实现接口,不能继承抽象类TestAbstractprivate abstract  static class innerAbs implements testInterface {}//抽象类内部可定义接口,接口可继承接口(不可实现implements),不可继承抽象类TestAbstractprivate static interface innerAbsI extends testInterface {}
}

接口

//接口不能使用private、static、final修饰
public interface  testInterface {//    public testInterface();//无参构造器不被允许
//    public testInterface(String ww);//有参构造器不被允许int dig=0;public final static String s = null;//不可为private、protected且成员变量必须初始化,但可以是public和缺省符static final String  sw=null;final String ww = null;//final可有可无,但变量必须赋值//    private static String ss = new String();//不能为private//不允许静态块/*static {String s = "";}*///public abstract  int a ;//不允许为抽象属性abstract String asb();//可有抽象方法,且不能有方法体,abstract不能与private、protected、default、static、final共存//静态方法必须有方法体,static不能与default、private、protected、abstract、final共存static String qq() {return null;}//    public String d(){};//无static就不能有方法体int dd();//default修饰必须要有方法体,default不可与abstract、static、final共存default int d() {return 0;}
//    private String df();//方法不能是private和protected的
//    public static final  t(){};//方法中final不能与static共存
//接口内部抽象类不能被private、final修饰,不能继承抽象类TestAbstractabstract static class innerIAbs implements testInterface {}
//内部接口不能被private、final修饰,接口可继承接口,但不可实现implements接口,不能继承抽象类,static  interface innerI extends testInterface {}
}

外部测试抽象类:

//如果TestAbstract类的构造是私有的,抽象类则不能继承,此处可继承抽象类(也可继承实体类)、可实现接口
public abstract class testAbs extends TestAbstract implements testInterface{public static void main(String[] args) {}
}

外部测试接口:

//外部接口还是只能继承接口不能实现,不能继承抽象类和实体类
public interface testInt extends testInterface {public static void main(String[] args) {}
}

普通测试类实现接口:

public class testI implements testInterface {@Overridepublic String asb() {return null;}@Overridepublic int dd() {return 0;}
}

普通测试类继承抽象类:

public class testA extends TestAbstract{@Overrideprotected String pa() {return null;}
}

还是挑重点总结一下吧:

(1)实现接口类必须实现(抽象类除外,如上述的抽象类testAbs)接口中所有的不带方法体的方法,即static和default修饰的方法除外;

(2)继承抽象类必须重写(抽象类除外,如上述的抽象类testAbs)他的所有抽象方法;

(3)接口定义的是对象的行为(即功能作用,能做什么),抽象类定义的是对象的本体组成(即是什么);

(4)接口要实现,抽象类要继承,一个类可以实现多个接口,但只能继承一个抽象类;

(5)接口可以继承接口,抽象类可以实现接口还可同时继承抽象类,抽象类也可以继承具体类,但接口不能。

(6)抽象类和接口都可以有静态的main方法;

(7)接口和抽象类中的抽象方法都不能有方法体;

(8)接口中可有default修饰的方法,抽象类不可以;

(9)接口和抽象类都不能使用private、static、final修饰;

(10)接口不能有有参和无参构造器,而抽象类都可以有;

(11)接口的成员变量不可以是private的,但抽象类可以;

(12)抽象类可由静态块,接口不能有;

(13)抽象类和接口都可以有静态方法,且都必须带方法体;

(14)抽象类中非抽象方法必带方法体,接口不必;

(15)接口和抽象类都可有非static、final修饰的普通成员变量;

参考(下面两篇文章中总结的有错误,以我代码试验为准):

https://blog.csdn.net/m0_38105216/article/details/85067156

https://blog.csdn.net/qq_44543508/article/details/102609910

这篇关于抽象类abstract与接口interface区别代码实战演示——观止的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/743452

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip