作为后端开发,感受下接口带来的魅力!🔥🔥

简介: 在一场大厂面试中,小南被问及何时选用接口,何时采用抽象类。一位拥有24K粉丝的博主给出解答:选择取决于需求——接口定义多个类需遵守的契约,而抽象类则用于创建共享实现的基类。有时两者结合使用,通过抽象类实现接口以确保契约并提供通用功能。此外,小南还分享了关于抽象类的深入探讨,包括子类如何正确调用父类构造函数、访问父类成员以及父类不可访问的方法等细节。最后,他提出一个关于接口与抽象类差异的小测验,并邀请读者关注他的开源项目《Java学习进阶指南》,旨在帮助Java开发者更好地掌握核心知识和面试要点。

点赞再看,Java进阶一大半

在一次某大厂面试中,小南(化名)被面试官问到:写代码你什么时候选择用接口,什么时候用抽象类?

一位海外博客拥有24k粉丝的程序员博主是这么回答的,友们怎么看?

在这里插入图片描述

Java 接口和抽象类之间的选择取决于您的特定要求。如果您需要定义多个不相关的类需要遵循的契约,请使用接口。但是,如果您想创建具有共享实现细节的可重用基类,请选择抽象类。在某些情况下,您甚至可以同时使用两者,使用抽象类实现接口来执行契约并为相关类提供通用基础。请记住考虑每个选项的优缺点,为您的软件设计做出最佳选择。

大家好,我是南哥。

一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。

1. 抽象类

1.1 子类调用父类

现在有IDEA集成开发环境,可以给大家实时提醒哪个地方编译错误,但假如要大家用.txt文件编写程序呢。南哥问:现在这段代码错在了哪?

class Base {
   
   
    public Base(String s) {
   
   
        System.out.print("B");
    }
}

public class Derived extends Base {
   
   
    public Derived (String s) {
   
   
        System.out.print("D");
    }
    public static void main(String[] args) {
   
   
        new Derived("C");
    }
}
AI 代码解读

假如父类和子类同时拥有有参构造方法,子类的构造方法必须显性地调用父类的构造方法,否则会编译错误。所以正常的写法应该是这样。

    public Derived (String s) {
   
   
        super(s);  
        System.out.print("D");
    }
AI 代码解读

另外大家还需要注意一点,调用父类的构造方法必须在子类构造方法的第一行,调用父类的构造方法也只能出现在子类的构造方法上,否则也会是编译报错。

1.2 子类访问父类

如下代码,一共有两处编译错误。提示:错误在Child类里,能快速找出来吗?

class Parent {
   
   
    public static String staticVar = "Static Variable from Parent";
    private static String privateStaticVar = "Private Static Variable from Parent";

    public static void staticMethod() {
   
   
        System.out.println(staticVar);
    }

    private static void privateStaticMethod() {
   
   
        System.out.println(privateStaticVar);
    }
}

class Child extends Parent {
   
   
    public void staticMethod() {
   
   
        System.out.println("Static method in Child");
    }

    public void display() {
   
   
        System.out.println(staticVar);

        System.out.println(privateStaticVar);
        privateStaticMethod();

        staticMethod();
}
AI 代码解读

(1)父类的私有变量、私有方法,子类是有继承的,但是不能访问。所以Child.display()里的以下调用是编译错误的。

System.out.println(privateStaticVar);
privateStaticMethod();
AI 代码解读

(2)子类可以继承,同时也可以访问父类的static变量、方法。但父类的static方法大家需要注意,子类是不能直接覆盖的,所以以下代码会编译错误。

    public void staticMethod() {
   
   
        System.out.println("Static method in Child");
    }
AI 代码解读

正确的做法是为该方法添加一个static修饰符,代表这是子类的一个新方法。这种写法叫做方法隐藏,子类和父类中都有一个相同名称和参数的静态方法时,子类的方法将隐藏父类的方法。

    public static void staticMethod() {
   
   
        System.out.println("Static method in Child");
    }
AI 代码解读

另外如果父类的方法使用final修饰,子类也是不能覆盖的。

1.3 父类不可访问的方法

紧跟着上文代码的例子,父类的方法同样使用static修饰,子类的privateStaticMethod方法算不算覆盖父类的方法呢?有没有编译报错?

class Parent {
   
   
    public static String staticVar = "Static Variable from Parent";
    private static String privateStaticVar = "Private Static Variable from Parent";

    private static void privateStaticMethod() {
   
   
        System.out.println(privateStaticVar);
    }
}

class Child extends Parent {
   
   
    public void privateStaticMethod() {
   
   
        System.out.println(staticVar);
    }
}
AI 代码解读

答案是编译正常。

父类中不可访问的方法,子类编写相同名称和参数的方法并不算覆盖。父类的方法都不能访问了,也就没有覆盖这一说法了。。。

2. 接口

2.1 访问修饰符的区别

接口和抽象类有三个方面的区别,分布是类的修饰、方法的修饰、变量的修饰。我们往下看看。

(1)类

接口使用interface修饰,而抽象类使用abstract修饰。当它们作为外部类时,只能使用public、default修饰,不能使用private修饰。

(2)方法

普通接口方法只能由public abstractdefaultstatic修饰。

抽象接口方法可以由所有修饰符修饰,除了final。

总结下,它们两者也有共同点,就是都不能使用final修饰。

(3)变量

普通接口变量只能由public static final修饰。

抽象接口变量可以由所有修饰符修饰。

2.2 静态分派

这算是一个很偏的知识点了,如下代码有三个名为getType的重载方法,它们的返回类型相同、方法名也相同,只有入参类型不同。

南哥问:程序执行结果是什么?

public class Test {
   
   
    public static void main(String[] args) {
   
   
        for(Collection<?> collection: collections) {
   
   
            System.out.println(getType(collection));
        }
    }

    public static final Collection<?>[] collections = {
   
   new HashSet<String>(), new ArrayList<String>()};

    public static String getType(Collection<?> collection) {
   
   
        return "Super:collection";
    }
    public static String getType(List<?> list) {
   
   
        return "Super:list";
    }
    public String getType(ArrayList<?> list) {
   
   
        return "Super:arrayList";
    }
}
AI 代码解读

南哥给大家这么一行代码:Collection<?> collection = new ArrayList<Integer>()左边Collection<?>其实是静态类型,右边的new ArrayList<Integer>()其实是动态类型。

编译器在处理重载方法时,是根据参数的静态类型作为判断依据,而不是根据动态类型。collections数组里面的所有实例的静态类型都是Collection<?>getType方法也都是执行上文的第一个重载方法。

# 程序员执行结果
Super:collection
Super:collection
AI 代码解读

你学会(fei)了吗?

最后

在某网站上看到22届Java校招一片红海?24届今年的行情呢?

在这里插入图片描述

本文收录在我开源的《Java学习进阶指南》中,涵盖了在大厂工作的Javaer都不会不懂的核心知识、面试重点。相信能帮助到大家在Java成长路上不迷茫,南哥希望收到大家的 ⭐ Star ⭐支持我完善下去。GitHub地址:https://github.com/hdgaadd/JavaProGuide

在这里插入图片描述

欢迎关注南哥的公众号:Java进阶指南针。公众号里有南哥珍藏整理的大量优秀pdf书籍!

我是南哥,南就南在Get到你的有趣评论➕点赞➕关注。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

目录
打赏
0
3
3
0
76
分享
相关文章
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
150 3
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
206 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
295 17
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
95 18
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
107 10
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
210 6
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
153 5
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
265 12
【一步步开发AI运动小程序】二十一、如何将AI运动项目配置持久化到后端?
本文介绍基于云智「Ai运动识别引擎」的运动配置持久化方案,旨在优化小程序或Uni APP中AI运动识别能力。通过将运动检测参数(如`Key`、`Name`、`TickMode`、`rules`或`samples`)持久化到后端,可避免因频繁调整运动参数而重新发布应用,提升用户体验。持久化数据结构支持规则和姿态样本存储,适用于关系数据库、文件或文档数据库(如MongoDB)。此外,云智还提供运动自动适配工具及「AI乐运动」产品,助力快速实现AI体育、全民健身等场景。
17.6K star!后端接口零代码的神器来了,腾讯开源的ORM库太强了!
"🏆 实时零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端定制返回 JSON 的数据和结构"

计算巢

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问