抽象类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;//成员属性不可定义为abstract
    private int d;//可为private
    private  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;//不能为static
        int 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修饰,抽象类可实现接口,不能继承抽象类TestAbstract
    private abstract  static class innerAbs implements testInterface {

    }
    //抽象类内部可定义接口,接口可继承接口(不可实现implements),不可继承抽象类TestAbstract
    private 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修饰,不能继承抽象类TestAbstract
    abstract 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 {
    @Override
    public String asb() {
        return null;
    }

    @Override
    public int dd() {
        return 0;
    }
}

普通测试类继承抽象类:

public class testA extends TestAbstract{
    @Override
    protected 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

### 回答1: 微软创建NT操作系统的历史可谓观止。NT操作系统是微软自1980年代中期开始开发的,经过多年的努力和完善,最终在1993年发布了第一个正式版本。NT操作系统以其稳定、高效和安全的特性,成为了微软在企业领域最重要的操作系统之一。 NT操作系统的成功给了微软一个稳定发展的基础,也推动了微软在未来的夺命狂奔。夺命狂奔是指在竞争激烈的软件市场上,为了保持领先地位而不断开发和发布新产品,微软通过不断创新和改进赢得了市场份额。 微软未来的夺命狂奔可以从它近年来推出的产品和服务中看出端倪。微软积极推广云计算服务Azure,这是一个强大的云平台,为企业提供了灵活、安全和可靠的解决方案。此外,微软还致力于发展人工智能技术,如语音识别、自然语言处理和机器学习等。这些创新不仅扩大了微软在企业市场的影响力,也增加了其全球用户的多样化需求。 微软在夺命狂奔中所面临的挑战也不容忽视。随着移动设备的普及,微软需要实现与iOS和Android等主流操作系统的兼容性,以保持在移动市场的竞争力。此外,随着开源软件的兴起,微软也需要适应这一趋势,积极参与开源社区,推动开源软件的发展。 总之,微软创建NT操作系统和未来的夺命狂奔展现了微软在软件行业的实力和潜力。通过持续的创新和不断进化,微软将继续在企业和消费者市场中扮演重要角色。 ### 回答2: 《观止:微软创建NT和未来的夺命狂奔》是一部以微软公司创造Windows NT操作系统和未来发展的故事为背景的电影。这个故事主要讲述了微软在当时面临的技术挑战、市场竞争和公司发展的困境,并展现了他们的不断努力和创新精神。 微软创建Windows NT操作系统的过程是一段充满曲折和艰辛的旅程。在那个时代,微软面对着Unix操作系统的垄断地位和其它竞争对手的激烈竞争。为了突破操作系统的技术限制和摆脱对其他公司的依赖,微软决定自己开发一款全新的操作系统。于是,他们成立了一个专门的团队,经过不断的研发和测试,最终诞生了Windows NT操作系统。 《观止:微软创建NT和未来的夺命狂奔》还聚焦于微软的未来发展。随着Windows NT的问世,微软成功地抓住了市场机遇,并成为全球最大的软件公司之一。电影展示了微软团队在公司内部的斗争和外部环境的变化。他们不断推出更新版本的Windows操作系统,提供更多的功能和更好的用户体验,以保持竞争优势。 此外,电影也揭示了微软面临的挑战和反思。他们在垄断调查和法律纷争中面临着巨大压力,并被要求在竞争和创新方面采取更加公平的做法。微软也通过收购和战略合作来扩大业务领域,尝试进军互联网和移动领域。然而,他们也面临着来自谷歌等公司的新兴竞争对手的挑战。 《观止:微软创建NT和未来的夺命狂奔》通过展示微软在创造和发展Windows NT操作系统过程中的挑战和努力,向我们展示了一个科技巨头如何在激烈的竞争中不断进步和寻求发展机遇。这部电影激励着观众们,鼓舞他们在面对困难和竞争时坚持创新和努力,并为未来的夺命狂奔奠定基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值