面试官:淦!0202年你还不知道面向对象?

山禾说 山禾说     2022-12-26     349

关键词:

2020年6月13日 多云转暴雨??

I‘m sad,tired,negative,powerless,miss,lonely fine :)

那你回去等通知吧

面试官:我看你简历上说,你的主要编程语言是Java,偶尔也用Python,那么你可以说一下这两个的相同点在什么地方吗?

山禾:它们都是高级程序设计语言,都是面向对象的语言。

面试官:那你讲讲你是怎么理解面向对象的吧。

山禾:emmm。。封装,继承,多态是面向对象的三大特征。

面试官:还有其他要补充的吗?

山禾:没了

面试官:那你回去等通知吧

是什么

痛定思痛,挫折只会让我变得更强,奥利给!下面开始进入正文,首先我们需要知道面向对象是什么?

面向对象,顾名思义,是面向对象,也就是说单身狗是不配使用面向对象的编程语言的(当然只是开个玩笑,逃)。

对象,就是把现实世界中的实物映射抽象到虚拟世界中,把实物的属性和行为,通过代码的方式表达出来。然后通过设计对象的数据结构(属性),然后使用算法进行行为的模拟(方法),就完成了从现实到虚拟的一个映射。

实体 对象
属性 数据结构 变量
行为 算法 方法

与面向对象经常拿来对比的就是面向过程编程,那么他们之间的区别在什么地方呢?

面向过程和面向对象

面向过程编程,打个比方,我们买过的一般的玩具(变形金刚),我们必须要按照它说明书上的步骤,一步一步的去组装,才能得到最后的玩具,如果我们想要一个新的玩具,就要去商场买一个新的,然后按照说明书的顺序一步一步的组装。

而面向对象编程,就可以理解为积木,没有一个固定的拼装方式,我们可以发挥自己的想象力,去自由的拼装和组装,同样的模块在不同的地方可以起到不同的作用(多态),一块儿积木就是一个最小的单位,我们不用去关心积木是怎么造的(封装)。也可以用多个对象组装起来去拼装成一个新的对象(继承)。大大的方便了我们的设计,不再拘泥于过程,极大程度上的放飞了生产力和效率。

为什么

我们刚刚已经了解了面向对象是什么,下面我们来说一下,为什么要用面向对象编程

  1. 首先从理解角度上来说,它符合我们对现实世界的认知习惯,更容易去理解、实现和设计我们的需求。

  2. 其次从软件设计的角度上来说,行为的实现对于外部是完全封闭的,只需要提供对应的接口就可以获得相应的结果,降低了代码与代码之间的耦合度。符合我们高内聚,低耦合的设计理念。优雅,客观,层次分明,像积木一样,可以方便的实现插拔和维护,对象组合而成的模块化和服务化,更是大大扩展了系统的伸缩性,便于维护、扩展和复用。这也是为什么越来越多的编程语言选择向这个方向去靠拢( TypeScript说的就是你

怎么用

刚刚我一直忍住,没有去提面向对象的三大特性:封装、继承和多态,我相信我们有一些经验的开发人员来说,这三个词语是再熟悉不过了。下面,我通过代码的方式,来看看这三个特性在代码中的模拟应用。

封装

@Data
public class Uzi 

    // 选手类型
    private String type;
    // 选手最擅长英雄
    private String bestHero;
    // 选手状态
    private Status status;
    
    public void play() 
        status.say();
    


public class Status 
   public void say()

上面是一段非常简单的代码,我定义了一个很简单的类,里面的nametypebestHero对于我们来说都是一个包装在盒子里的东西。比如:

    Uzi uzi = new Uzi();
    uzi.setType("ADC");
    uzi.setBestHero("孙尚香");

我们看到的Uzi可能就是一个主玩孙尚香的职业ADC选手(??狗头保命,我啥都不知道),他怎么玩的,我们不需要知道,我们只需要知道他这样的一名选手就可以了。这就是封装的魅力:

  1. 隐藏了实现的细节,提供对外的访问方式。
  2. 外部如果想要访问,必须经过这个方法。

继承

看完了封装,下面我们来看继承,我们分别用三个状态去继承Status类:

public class ShunFeng extends Status 
    
    @Override
    public void say()
        System.out.println("顺风狂小狗");
    

public class NiFeng extends Status 
    
    @Override
    public void say()
        System.out.println("逆风简自豪");
    


public class JueJing extends Status 
    
    @Override
    public void say()
        System.out.println("绝境Uzi");
    

关键字extends表示正在构造的新类派生于一个已经存在类。这个已经存在的类被称为父类(超类,基类);新创建的类被称为子类。在通过扩展父类定义子类的时候,仅仅需要指出子类和父类的不同之处。因此在设计类的时候,应该将通用的方法放在父类中,而将具有特殊用途的方法放在子类中。

我们只是在父类Status中定义了say方法,然后三种不同的类去继承这个类,然后实现方法,这样就体现出了面向对象在设计上的可扩展性,但是需要注意的是,继承会破坏封装,我们需要谨慎使用,尽量使用一些设计模式去避免继承,合理使用,才能体现出它的优势~

说完了继承,接下来就要去说多态了。

多态

在说多态之前,我们先来看一下代码:

public class Test 
    public static void main(String[] args) 
        //uzi1
        Uzi uzi1 = new Uzi();
        ShunFeng shunFeng = new ShunFeng();
        uzi1.setStatus(shunFeng);
        //uzi2
        Uzi uzi2 = new Uzi();
        NiFeng niFeng = new NiFeng();
        uzi2.setStatus(niFeng);
        //uzi3
        Uzi uzi3 = new Uzi();
        JueJing jueJing = new JueJing();
        uzi3.setStatus(jueJing);
        
        //uzis
        Uzi[] uzis = uzi1,uzi2,uzi3;
        // 多态
        for (Uzi uzi : uzis) 
            uzi.play();
        
    

运行程序的结果: 技术图片 (TMD,泪目,??青结)

所谓的多态就是一个对象变量(比如上文中的status变量)可以指示多种实际类型的现象(比如status既可以引用Status对象,也可以引用它的子类ShunFeng对象)被称为多态。在运行时候能够自动地选择调用哪个方法的现象被称为动态绑定,上面打印出的语句,就说明了这一点。

后续

原来我们天天挂在口边的面向对象,其实某种程度上来说,更像是一种哲学,一种计算机科学发展的自然规则。

如果你有学到,请给我点赞??+关注,这是对一个?坚持原创作者的最大支持!我是山禾,千篇一律的皮囊,万里挑一的灵魂,一个不太一样的写手。

世事洞明皆学问,人情练达即文章。

技术图片


































































面试官:什么是对象池?有什么用?别说你还不会!(代码片段)

作者:HaiXiang来自:https://www.cnblogs.com/haixiang/p/14783955.html对象池顾名思义就是存放对象的池,与我们常听到的线程池、数据库连接池、http连接池等一样,都是典型的池化设计思想。对象池的优点就是可以集中管理... 查看详情

面试官:什么是对象池?有什么用?别说你还不会!(代码片段)

点击关注公众号,Java干货及时送达作者:HaiXiang来自:www.cnblogs.com/haixiang/p/14783955.html对象池顾名思义就是存放对象的池,与我们常听到的线程池、数据库连接池、http连接池等一样,都是典型的池化设计思想。... 查看详情

面试官:什么是对象池?有什么用?别说你还不会!(代码片段)

对象池顾名思义就是存放对象的池,与我们常听到的线程池、数据库连接池、http连接池等一样,都是典型的池化设计思想。对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提... 查看详情

测试经理:“工作五年你连服务端接口测试还不知道?“

服务端的接口测试我们一般从功能开始进行测试,比如请求参数和响应参数的校验,业务逻辑或业务规则的校验,数据库操作的校验。功能正常后会根据需要进行安全相关的检查、性能测试以及系列扩展测试,比... 查看详情

测试经理:“工作五年你连服务端接口测试还不知道?“(代码片段)

服务端的接口测试我们一般从功能开始进行测试,比如请求参数和响应参数的校验,业务逻辑或业务规则的校验,数据库操作的校验。功能正常后会根据需要进行安全相关的检查、性能测试以及系列扩展测试,比... 查看详情

java基础——面向对象

...又来啦,今天我们来说说Java的面向对象。还记得之前去面试几家公司的实习生职位,大部分面试官都问过我有关面向对象的问题,不知道以后还会不会问,估计是不会了吧。。。(:3[▓▓]下面我们来说正事!(???)? 面向对象特... 查看详情

js面向对象整理

有次面试的时候,面试官让我谈谈对面向对象的理解,让我一下蒙了,竟然不知道从哪里说起?自己都是在看完视频后,直接用面向对象写东西,也没有好好梳理,导致自己只会简单的用一下,却不会说。于是我就翻了翻《JavaSc... 查看详情

200道java面试题整理,掌握这些还怕面试官?

CSDN话题挑战赛第2期参赛话题:学习笔记目录面向对象JDKJREJVM线程、并发相关springspringmvc、springBootMybatisMysql什么是最左前缀原则?什么是最左匹配原则unionredisredis集群方案分布式/微服务kafka怎么处理消息顺序、重复发送... 查看详情

这些自动化测试框架知识你还不知道?

这些自动化测试框架知识你还不知道?!  无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架。之前学习自动化测试的过程中,一直对“框架”这个词知其然不知其所以然。  最近看了很多自动化相关的资... 查看详情

面试官:java中对象都存放在堆中吗?你知道逃逸分析?

面试官:Java虚拟机的内存分为哪几个区域?我(微笑着):程序计数器、虚拟机栈、本地方法栈、堆、方法区面试官:对象一般存放在哪个区域?我:堆。面试官:对象都存放在堆中吗?我... 查看详情

面试官,java8中jvm内存结构变了,永久代到元空间

在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试者,如果知晓这些变化,又将成为面试中的亮点。如果在网络上搜索JVM内存结构,90%的可能会搜到Java7... 查看详情

面试官:什么是对象池?有什么用?别说你还不会(代码片段)

对象池顾名思义就是存放对象的池,与我们常听到的线程池、数据库连接池、http连接池等一样,都是典型的池化设计思想。对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提... 查看详情

听说你还不知道completablefuture?(代码片段)

java8已经在日常开发编码中非常普遍了,掌握运用好它可以在开发中运用几行精简代码就可以完成所需功能。今天将介绍CompletableFuture的在生产环境如何使用实践。CompletableFuture类作为Java8ConcurrencyAPI改进而引入,熟悉的同学应该... 查看详情

面试官的窒息逼问:到底什么是面向接口编程?

...信,看到会及时回复!文章大纲🐹一、前言🐣二、面试官这样询问的用意🐰三、什么是接口🐷四、面向过程编程、面向对象编程、面向接口编 查看详情

面试官的窒息逼问:到底什么是面向接口编程?

...信,看到会及时回复!文章大纲🐹一、前言🐣二、面试官这样询问的用意🐰三、什么是接口🐷四、面向过程编程、面向对象编程、面向接口编 查看详情

grd(渲染币)悄然来袭,你还不知道吗?

GRD(渲染币)悄然来袭,你还不知道吗?挖矿已经是行业内的一门显学,挖矿的门槛在逐步的降低而对应的挖矿的回报率也在逐步恢复到理性的状态。BTC、ETH、BCH、LTC的挖矿投入成本、回本周期,回报率对于很多老矿工而言已经... 查看详情

面试官,java8jvm内存结构变了,永久代到元空间

...在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试者,如果知晓这些变化,又将成为面试中的亮点。如果在网络上搜索JVM内存结构,90%的可能会搜到Java7... 查看详情

都2017年了,h5这些知识你还不知道?

一、交互上,慎用横屏展示效果。但是在今年的微信传播中,好的创意也可以尝试使用。       原因:体验上,需要用户设备开启屏幕旋转功能,才能正常观看,用户操作成本高。对不同屏幕的手机,长宽比... 查看详情