资讯动态

Java抽象类和接口基础超详细解析,看完包懂的,兄弟

发布时间:2026/8/12 17:25:13 来源:尧图企业网站定制
前言❤️❤️hello hello这里是洋不写bug~欢迎大家点赞关注收藏抽象类和接口在项目中使用频率非常高这两部分内容可以看作是在继承基础上的拓展通过抽象类和接口的使用可以在做项目时更加简洁的使用多态和进行团队协作这篇博客就会从基础部分解析抽象类和接口其中涉及的知识点在前面的多态和继承博客中很多可以找到铁汁们也可以点击下面的专栏链接复习一下个人主页洋不写bug的博客所属专栏Java学习之旅从入门到进阶铁汁们对于Java的各种常用核心语法不太常用的也有都可以在上面的Java专栏学习专栏正在持续更新中有问题可以写在评论区或者私信我哦~1抽象类简介在最初学习类时我们就知道类是现实事务在Java代码中的一种“抽象的表示形式”普通的类包含属性和方法描述生活中一些事物的属性和动作抽象类就是把这种基础的类做了进一步的抽象就是只写一个方法名和参数信息把方法的实现部分给省略了这在Java中就称为抽象方法包含抽象方法的类就称为抽象类这个单看概念比较抽象也不知道有什么用这里就举个例子在上篇多态博客中在进行多态的优缺点分析时举了这样一个例子代码如下所示这里面Rect、Circle、Flower类继承Shape类进行打印packagepackage3;publicclassShape{publicvoiddraw(){System.out.println(打印形状);}}packagepackage3;publicclassRectextendsShape{Overridepublicvoiddraw(){System.out.println(□);}}packagepackage3;publicclassCircleextendsShape{Overridepublicvoiddraw(){System.out.println(〇);}}packagepackage3;publicclassFlowerextendsShape{Overridepublicvoiddraw(){System.out.println();}}这个Shape类里面的draw方法在里面加了个打印语句其实这个打印语句是没啥用的Shape类里面的draw方法甚至都不需要写任何的逻辑只需要把方法名参数类型写上就行了那就可以这样写把这个方法写成抽象方法就只有方法名和参数类型没有具体的实现逻辑加个abstract修饰方法表示这个方法是抽象的如下所示publicabstractclassShape{publicabstractvoiddraw();}抽象方法必须写在抽象类中通过abstract修饰的类就是抽象类通过abstract修饰的方法就是抽象方法如果一个类中有抽象方法那这个类也必须是抽象类如下所示在普通类中写抽象方法就会报错抽象类其实没有什么特别的要求里面写不写抽象方法都可以但是一般类中写抽象方法时我们才把这个类写成抽象类抽象方法中也可以包含普通的、静态的属性或者普通的、静态的方法2抽象类特征首先抽象类不能直接实例化对象publicabstractclassShape{publicabstractvoiddraw();}在抽象类中因为可能会有抽象方法抽象方法是没有具体的实现逻辑的如果抽象类能实例化对象那调用对象的方法就没法执行了抽象方法不能是private的也不能被static和final修饰抽象方法写出来就是让子类重写的上面这几种情况子类是没办法重写的的那写这个抽象方法就没有什么意义了抽象类必须被继承并且继承后子类要重写父类的抽象方法子类如果也是抽象类那子类继承父类就不需要重写父类的抽象方法如下图子类继承了父类父类是抽象类那子类就必须重写父类中的抽象方法否则就会报错如果子类也是抽象类那子类就不需要重写父类的抽象方法这种抽象类继承抽象类在日常开发中很少使用铁汁们了解一下即可如下图抽象类中不一定要有抽象方法但是有抽象方法的类一定是抽象类这个在前面抽象类的简介中已经提到过这里就不再赘述了抽象类中可以有构造方法供子类创建对象时初始化父类的成员变量虽然抽象类没有办法实例化对象但是抽象类中是可以写构造方法的子类进行初始化时会触发父类的构造方法这时候可以完成一些父类属性的初始化3抽象类的作用抽象类其实本质上实现的效果就是让编译器进行更多的检查例如子类继承抽象类后必须重写抽象类中的抽象方法否则就会编译器就会报错这些效果其实跟Override类似也是必须重写Java中设定抽象类语法就是为了做出更好的检查因为人是不靠谱的有时候会搞错假如说规定子类中必须重写父类Shape的draw方法如果不使用抽象类这里忘了重写或者方法名字写错的话draw方法写成drawShape方法完全不会报错publicclassShape{publicvoiddraw(){}}但是使用了抽象类这里无论是忘记重写或者方法名写错编译器都会报错提醒程序员父类不这样搞的话子类就会放飞自我可能就达不到多态的效果publicabstractclassShape{publicabstractvoidshape();}4接口简介interface在做项目时接口的使用频率要远远高于抽象类在计算机中接口其实有很多不同的含义C语言中一个函数可以称为是一个接口Java中的interface工作中把一个大的项目分成多个模块模块间相互调用的部分也称为接口服务器能够处理哪些请求也称为“服务器提供的接口”图形化界面(GUI)中程序给用户提供的操作页面也称之为接口那如何创建一个接口呢这里我们new选择Java Class选中第二个interface即可之前都是默认创建class也就是类这里我们创建一个Shape接口对于接口来说里面不能包含属性包含的方法也只能是抽象方法而且interface中的所有方法默认都是public abstract类型的如下图这里public abstract是灰色的也就是不写也可以(这里draw是灰色表示这个方法当前没有被调用)如下所示直接这样写就可以是不是很方便因此接口就可以看作是「强化版、纯规范版」的抽象类在公司中使用接口通常有以下要求创建接口时接口的命名一般以大写字母I开头接口的命名一般使用“形容词”词性的单词类/变量的命名是名词方法命名是动词/动宾短语阿里编码规范中约定接口中的方法和属性不要加任何修饰符号以保持代码的简洁性当然这些东西还是要看公司的具体要求那这里接口名字按照标准来命名就不是Shape应该是Drawable表示可绘制的接口中也可以写变量实际开发中几乎不会这样做但是变量必须赋值这里的变量铁汁们甚至可以理解为都不算属性publicinterfaceDrawable{voiddraw();intcount0;}如下图变量的属性是static final类型的final就是在其他地方只能访问不能修改static是这个变量全局只有这一份跟抽象类类似接口也是不能直接实例化的要想使用接口就要创建类来“实现接口”这里就不叫继承对于实现接口的类来说也没继承到什么东西没有能重用的东西还要严格按照接口中提供的抽象方法在子类中进行重写实现接口的类也不称为“子类”通过接口实现的方式同样也能触发多态5接口使用计算机上的USB接口可以插入鼠标或者键盘这里我们就写个USB接口让鼠标类和键盘类来实现它类实现接口就用implementspublicinterfaceUSB{voidopenDevice();voidcloseDevice();}publicclassKeyBoardimplementsUSB{OverridepublicvoidopenDevice(){System.out.println(插入键盘);}OverridepublicvoidcloseDevice(){System.out.println(拔出键盘);}}publicclassMouseimplementsUSB{OverridepublicvoidopenDevice(){System.out.println(插入鼠标);}OverridepublicvoidcloseDevice(){System.out.println(拔出鼠标);}}写代码时有个小技巧这里类实现接口后可以把鼠标放在这段代码上按alt enter键再一直连按enter键就可以自动补全方法重写如下所示接着在main方法中创建对象使用一下这里其实跟继承代码类似这里是创建一个接口的引用指向具体的对象如下所示publicclassTest{publicstaticvoidmain(String[]args){USBusbnewMouse();usb.openDevice();usb.closeDevice();usbnewKeyBoard();usb.openDevice();usb.closeDevice();}}接口的注意事项如下接口类型是一种引用类型但是不能直接new接口的对象接口中的每个方法都是public的抽象方法接口中的所有方法被隐式指定为public abstract写成其他形式就会直接报错接口中的方法不包含具体的逻辑需要由实现接口的类来实现接口的实现类中重写的方法方法权限只能是public接口中方法的访问权限是public实现类重写后不能低于这个权限那就只能是public了接口中可以含有变量但是接口的变量会被隐式的指定为 public static final接口中不允许有静态代码块和构造方法因为静态代码块的作用就是在类加载阶段初始化成员变量但是接口的成员变量是final类型的只能进行就地初始化后面不能再修改了尝试在静态代码块中再次初始化就会报错至于构造方法在抽象类中有实例属性需要通过构造方法来初始化但是接口中是没有实例属性的因此接口中写构造方法也没啥用就不允许出现如果类没有实现接口中的抽象方法那这个类就要设置为抽象类这种一般使用的不多接口虽然不是类但接口编译完成后字节码文件的后缀格式就是.class编译器在处理时也是把接口当成类处理的jdk8中接口中还可以包含default方法这个是特例几乎用不到6接口实现多继承接口和抽象类里面都提供了抽象方法直观上感觉抽象类的功能更强一些接口的限制更严格一些但是两者还有一个区别那就是使用抽象类时一个类只能继承一个抽象类使用接口时一个类可以实现多个接口使用接口就可以解决项目中的一些多继承需求场景示例如下用接口表示动作接着搞个动物类表示父类写个小猫类继承Animal类实现IRunning接口再写个鱼类继承Animal类实现ISwimming接口packagepackage6;publicinterfaceIRunning{voidrun();}packagepackage6;publicinterfaceIFlying{voidfly();}packagepackage6;publicinterfaceISwimming{voidswim();}packagepackage6;publicclassAnimal{privateStringname;publicAnimal(Stringname){this.namename;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}}packagepackage6;publicclassCatextendsAnimalimplementsIRunning{publicCat(Stringname){super(name);}Overridepublicvoidrun(){System.out.println(getName()使用四条腿跑);}}packagepackage6;publicclassFishextendsAnimalimplementsISwimming{publicFish(Stringname){super(name);}Overridepublicvoidswim(){System.out.println(getName()游泳);}}接着在main方法中使用一下示例如下所示packagepackage6;importjava.io.File;publicclassTest{publicstaticvoidmain(String[]args){CatcatnewCat(小猫);System.out.println(cat.getName());cat.run();FishfishnewFish(小鱼);System.out.println(fish.getName());fish.swim();}}那如果是青蛙会游泳也会跑就同时实现两个接口两个接口之间用逗号隔开即可packagepackage6;publicclassFrogextendsAnimalimplementsISwimming,IRunning{publicFrog(Stringname){super(name);}Overridepublicvoidrun(){System.out.println(getName()用两条腿跳);}Overridepublicvoidswim(){System.out.println(getName()游泳);}}packagepackage6;publicclassTest{publicstaticvoidmain(String[]args){FrogfrognewFrog(青蛙);System.out.println(frog.getName());frog.run();frog.swim();}}如果是鸭子就可以飞跑游泳那就同时继承这三个接口铁汁们可以自己尝试写一下补充一点接口也可以继承接口例如我们再写个两栖类接口两栖类英语是amphibians继承IRunning和ISwimming如下所示结语抽象类和接口存在的作用就是协助程序员之间进行良好的沟通因为在实际开发中一个程序通常不是由一个人完成的N个模块每个模块由一个人负责最终这些模块之间要相互调用例如A模块给B模块提供一个功能此时就需要约定功能具体是如何实现的通过怎样的类怎样的方法名怎样的参数怎样的返回值类型A模块定义这些内容B模块调用这些内容那就需要提前约定好这些东西都是什么样的那无论是口头约定还是发邮件书面约定都是不太靠谱的因为具体实现的时候可能一不小心就搞错了最后还要调很多bug最好的方法就是提前在接口中明确这些内容模块实现这些接口写的方法有一点不规范编译器就会报错这样就能很好的解决多人协作的问题以上就是今天的所有内容啦完结撒花

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价