面试差点挨揍,原来Java面向对象套路这么深……

本文是我和xqnode联合创作,已收录至我们的GitHub,欢迎大家给个Star:https://github.com/nxJava/nx_java

我们会持续更新,欢迎监督!

微信搜索:武哥聊编程,关注这个Java菜鸟~

小故事

话说这天,正值酷暑,天气燥热,武哥却起了个大早,正对着车镜子整理油头。

正巧我准备去买早点,路过看到武哥撅着sexy的屁屁边哼着小曲儿边卖弄风骚,实在有点看不过去,真想狠狠踹他两脚。

武哥似乎发现了我,从车后视镜里对着我打招呼,还不忘挑了个眉,那神情,别提有多骚气。

为了不跟这货有什么说不清道不明的纠缠,我假装没看到,加快了点脚步往早点摊奔去。听说最近地摊经济特别火,摊点数量也扩大了一倍多,哈哈,终于不用排队买我最爱吃的豆腐花了。

武哥看我没搭理他,也没生气,继续整理着头发,喷一点发胶,今天换了个小哥哥们都喜欢的分发纹理款,不知道要去迷倒哪位小姐姐。

过了半晌,我早餐都买回来了,特地给武哥带了俩酱肉包子,路过武哥的车,却没看到他人,正奇怪间,一只咸猪手悄悄伸了过来。

我还没反应过来,肉包已经进了武哥嘴里了。

一口塞两个包子,真是绝了,腮帮子鼓的老高,那吃相,让我想起上次在老家喂的“二师兄”。还没等我说话,武哥就慌忙钻进车里,一脚油门就扬长而去,害我吃一脸灰。

你说气人不?敢情这货吃早餐连个招呼都不打?不知道这么火急火燎的是去跟哪家的小姑娘有约。我算是记下了,下次非把他车轱辘卸了。

你别看武哥今天这么潇洒,其实他是要去面试的,除了故作镇定,宠辱不惊外,武哥最拿手的就是吹牛逼。想当初,我跟武哥刚认识那会,他可是喝着啤酒给我吹了一晚上。从他公司老大对他工作的种种苛责说到当代互联网公司用人管理制度的种种漏洞;从他幼年时期爱慕已久的隔壁小红到如今上了年纪摆摊卖早点的煎饼西施;从上海蹬着小三轮收废品到全国各地开演唱会(街头弹唱卖艺),武哥的人生可以用精彩来形容,他不去写个自传真是可惜了。

都是过往云烟,转眼武哥来到某某科技公司的大楼下,看着高耸入云的充满现代气息的大楼,武哥心头一阵激昂。

多少年了?我们武哥终于回来了!回到这个曾经叱咤风云的战场,多少次加班?熬夜吹的那些牛逼,曾经一起写BUG的老伙计们都还好吗?

想到这里,武哥眼角有一点湿润了。

回到现实,打起精神,武哥走进大楼,对着玻璃摸了一把油头,再次确定他是整个楼最靓的仔后,敲开了面试官的房门。

武哥:(摆出十分老练的样子)大哥好,我是来面试Java开发岗位的。

面试官:(擡头扫了武哥一眼,眉头一皱)你就是武哥?怎么迟到这么久?约好早上9点半,你看看现在几点了?你再不来,我都要去吃午饭了。

武哥:(看出情势不妙,又摆出憨憨的样子)额…大哥…是这样的。早上不是上班高峰吗?本来路上车多就很堵,恰好我看到一位老奶奶在路边摔倒了,作为一个社会三好青年,遇到这样的事情,我怎么能不出手相助呢?对不对?然后…

面试官:行了,行了。后面你是不是还救了老奶奶,送了老奶奶去医院,可是呢,老奶奶倒地不起,就是不去医院,还赖上你,说是你撞倒了她,要你赔钱。你为了不耽误太多时间,只能自己认栽,给了老奶奶200块钱私了。我说的没错吧?

武哥:卧槽?大哥你真神了!你是不是当时也在旁边看着呢?只不过钱你说错了,不是200,是500!你说我这是造了什么孽?

面试官一脸鄙夷看着武哥,摇头叹了口气:哎,你们现在年轻人说起谎来都不能有点创意吗?你这剧情这周我已经听到第五个版本了,什么扶老大爷过马路,送小妹妹上学,甚至替外卖小哥送外卖的我都听说过,我可真是长见识了,呵呵…

武哥:(腼腆一笑,想转移点话题缓解尴尬)那个…大哥,要不咱们开始面试?

面试官:行吧,看你大老远跑一趟,也不容易,那你简单自我介绍下吧。

武哥清了清嗓子:啊~ 噢~ 嗯~

面试官有点坐不住了,这人怎么这么骚?

武哥向来以脸皮厚著称,完全不care面试官,开始吹起自己开挂的人生经历:是这样的,我17年硕士毕业于同济大学。先后在 eBay、爱奇艺、华为、科大讯飞、拼多多踩坑,Java 编程是我自学的,说起我自学Java那段时间,那要从一个月高风黑的夜晚说起…

面试官:(慌忙挥了挥手,心想敢情这货是个吹牛逼的行家啊,这么吹下去,我还吃不吃午饭了,还想着吃完搞把农药睡上一会呢)咱们直接进入正题吧。你面试的是Java,那你知道什么是类么?

武哥:老哥你放心,我工作很积极、很实在的,不知道什么叫累。

面试官:知道什么是包吗?

武哥:我平时自己揹包的,不麻烦公司了。

面试官:知道什么是接口吗?

武哥:我这个人工作认真。从来不找借口偷懒的。

面试官:知道什么是继承么?

武哥:我家徒四壁,没什么可以继承的。

面试官:知道什么叫对象么?

武哥:(羞射一笑)实不相瞒,我已经结婚了,不搞对象了。

面试官:知道多态么?

武哥:知道,但是这种事我不会干的,我最恨的就是不负责任让自己心爱的人忍受巨大痛苦堕胎的渣男!

面试官:你是猴子请来的逗比吗?

武哥:不是,我自己开车来的。

面试官:我知道,我是说你是逗比。

武哥:你什么意思?你这人怎么骂人呢?

说着武哥红着脸撸起袖子来,准备大干一场。

这时面试官站了起来。

武哥看着面前比自己高一个头的大个儿,心里一句卧槽,气势全丢了。灰溜溜的夺门而逃。

回来后,我问武哥面的咋样了。

武哥一声不吭,抱着我就开始放声痛哭。

我很惊诧,只能摸着武哥的背默默安慰起来…

问了半天才知道武哥面试被打击了,这时候我偷偷拿出了我珍藏依旧的Java学习指南,翻到面向对象这一章节,开始给武哥讲了起来…

干货

Java面向对象,有三大特性,下面一个一个细细展开。

封装

public、private、protected修饰符

说到封装,Java 中有三个访问权限修饰符:private、protected 以及 public,如果不加访问修饰符,表示包级可见。我们先来看下这三个修饰符的作用。

修饰符 当前类 同包 子类 其他包
public
protected ×
default × ×
private × × ×

设计良好的模块会隐藏所有的实现细节,把它的 API 与它的实现清晰地隔离开来。模块之间只通过它们的 API 进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被称为信息隐藏或封装。因此访问权限应当尽可能地使每个类或者成员不被外界访问。

如果子类的方法重写了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例去代替,也就是确保满足里氏替换原则。

规范

字段决不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。例如下面的例子中,AccessExample 拥有 id 公有字段,如果在某个时刻,我们想要使用 int 存储 id 字段,那么就需要修改所有的客户端代码。

public class AccessExample {
    public String id;
}

可以使用公有的 getter 和 setter 方法来替换公有字段,这样的话就可以控制对字段的修改行为。

public class AccessExample {

    private int id;

    public String getId() {
        return id + "";
    }

    public void setId(String id) {
        this.id = Integer.valueOf(id);
    }
}

封装的好处

  1. 提高数据的安全性。
  2. 操作简单。
  3. 隐藏了实现。

继承

继承是类与类的一种关系,是一种“is a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。如下图所示:

注:java中的继承是单继承,即一个类只有一个父类。

继承的初始化顺序

  1. 初始化父类再初始化子类
  2. 先执行初始化对象中属性,再执行构造方法中的初始化。

基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:

父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法

继承这块大家都比较熟,我来举个例子:

继承示例

Animal动物:

public class Animal {
    /**名称*/
    public String name;
    /**颜色*/
    public String color;
    
    /**显示信息*/
    public void show(){
        System.out.println("名称:"+name+",颜色:"+color);
    }
}

Dog狗:

/**狗继承自动物,子类 is a 父类*/
public class Dog extends Animal {
    /**价格*/
    public double price;
}

dog并没有定义color属性,但在使用中可以调用,是因为dog继承了父类Animal,父类的非私有成员将被子类继承。如果再定义其它的动物类则无须再反复定义name,color与show方法。

多态

多态这块,我要跟大家好好唠叨唠叨,首先来看下概念:

多态概念

多态:一个对象具备多种形态。
①父类的引用类型变量指向了子类的对象
②接口的引用类型变量指向了接口实现类的对象

多态的前提:必须存在继承或者实现关系。

动物 a  = new();

多态要注意的细节

  1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
  2. 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
  3. 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
  4. 多态情况下,不能访问子类特有的成员。

总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。

注意:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错。(编译看左边)

多态的应用

  1. 多态用于形参类型的时候,可以接收更多类型的数据。
  2. 多态用于返回值类型的时候,可以返回更多类型的数据。

多态的好处: 提高了代码的拓 展性。

我们想想,平时写MVC三层模型的时候,service为什么要写接口呢?因为可能有个service会有多种不同的实现。service就是我们平时用多态最多的地方。


如果觉得有帮助,希望老铁们来个三连击,给更多的人看到这篇文章

1、关注我的原创微信公众号「武哥聊编程」,专注于Java、数据结构和算法、微服务、中间件等技术分享,保证你看完有所收获。

2、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我继续写作,嘻嘻。

作者info

【作者】:武哥
【公众号】:武哥聊编程。欢迎大家关注~
【作者简介】:同济大学,硕士。先后在华为、科大讯飞、拼多多采坑。一个自学 Java 的菜鸟,期待你的关注。

点赞是对我最大的鼓励
↓↓↓↓↓↓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章