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

简介: 在一场大厂面试中,小南被问及何时选用接口,何时采用抽象类。一位拥有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
分享
相关文章
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
122 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
122 6
17.6K star!后端接口零代码的神器来了,腾讯开源的ORM库太强了!
"🏆 实时零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端定制返回 JSON 的数据和结构"
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
112 2
记录一次后端接口抖动的排查过程
某天下午,测试新功能时发现页面接口偶尔变慢,平均十次调用中有三到四次出现3秒以上的延迟。排查了接口、数据库和服务器资源后未发现问题,最终锁定为K8s节点的负载均衡策略导致。测试环境仅有一个公网IP,SLB轮询四个Pod(其中三个为空),造成周期性延迟。移除空Pod后问题解决。
107 5
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
262 3
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
深入理解后端开发:从基础到高级
本文将带你走进后端开发的神秘世界,从基础概念到高级应用,一步步揭示后端开发的全貌。我们将通过代码示例,让你更好地理解和掌握后端开发的核心技能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和启示。
175 6
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
77 1

计算巢

+关注
AI助理

你好,我是AI助理

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