2021-7-9 百度面经

面试官评价:首先,基础知识比较薄弱,回答得不是很全面;其次,项目所用到的技术栈比较少。
总结:技术水平不行,也无法从基础看出潜力。

哎,目前还没有通过一面的面试,确实在技术上该好好沉淀一下。
喊了很久的Spring该上手做个项目了,基础该整体过一遍,道阻且长,继续加油!


Part 1 Java基础部分


请说说面向对象的三大特性

继承、多态、封装

难以置信我卡壳了,因为我没想到会问得这么基础。之后在三大特性上问了好多。

延伸问题

1.封装有什么好处?

封装就是类把方法和属性都包围起来,对数据的访问只能通过已定义的接口。
在Java中通过关键字private、public、protected和default来实现封装。优点体现在
(1)提高了代码的安全性。
(2)提高了代码的复用性。
(3)能实现高内聚,封装细节,提高可维护性。
(4)能实现低耦合,便于调用者使用,不需关心细节。

2.多态的形式有哪些?

多态体现为父类引用变量可以指向子类对象:父类类型 变量名 = new 子类类型();
前提: 必须有子父类关系或类实现接口的关系。
调用方法时,会调用子类重写后的方法。
形式主要有三种:

  1. 普通类多态:父类 变量名 = new 子类();
  2. 抽象类多态:抽象类 变量名 = new 子具体类();
  3. 接口的多态:接口 变量名 = new 接口的实现类();

方法的重载和重写是实现多态的重要方式,前者(重载)是编译时多态,后者(重写)是运行时多态。

3.使用多态后,父子类成员变量和成员方法有什么变化?

成员变量

/*父类*/
public class testFather {
    int num = 4;
}
/*子类*/
public class test extends testFather{
    int num = 5;

    public static void main(String[] args) {
        testFather f = new test();
        test z = new test();
        System.out.print(f.num);
        System.out.print(z.num);
    }
}

控制台输出结果:4 5
总结:编译运行看左边
编译时,参考的是引用变量所属类中是否有对应的成员变量,若没有则编译失败。
运行时,调用的也是引用变量所属类中的成员变量。
(接口、抽象类也一样)

成员方法

/*父类*/
public class testFather {
    public void show() {
        System.out.println("Father");
    }
}
/*子类*/
public class test extends testFather {
    public void show() {
        System.out.println("Son");
    }

    public static void main(String[] args) {
        testFather f = new test();
        f.show();
    }
}

控制台输出结果:Son
总结:编译看左边,运行看右边
编译时,参考的是引用变量所属类中是否有对应的成员变量,若没有则编译失败。
运行时,调用的是对象所属类(子类)中的成员变量。

4.多态的向上转型与向下转型。

多态本身就是向上转型的。所谓向上转型,就是子类对象赋给父类引用变量。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换,将父类引用转为子类引用,这个过程就是向下转型。(未经过向上转型的对象无法向下转型!)

5.多态的优点与弊端是什么?

优点:

  • 提高了代码的维护性。
  • 提高了代码的延展性。
  • 可以当作形式参数,接收任何类型的子类对象。

弊端:

  • 不能使用子类特有的属性和方法。

6.继承和接口的区别是什么?

  • 语法层次上:
    继承是对类的继承,使用extends关键字,若是对抽象类的继承,抽象类应有abstract关键字。抽象类中可以有未实现的方法,称为抽象方法,加abstract关键字。可以有已实现的方法,也可以定义成员变量。Java只支持单继承。
    由interface修饰的称为接口,接口所有的成员变量默认都是public static final的常量。接口中全是抽象方法。一个类可以实现多个接口,但必须实现接口里的所有方法。

  • 抽象层次上:
    若继承的是抽象类,它是对类的抽象,包括属性、行为;而接口是对行为的抽象。

  • 合理的继承关系需要满足“is-a”条件,即父类和子类在本质上应该是相同的,子类从属于父类,父类是发现子类的公共部分后抽象出来的。而接口不要求接口的实现类和它在本质上相同,使用更灵活。

  • 设计层次上:
    继承是自底向上层层抽象出来的一种关系,而接口是自顶向下设计出来的一种关系。

光光是面向对象的三大特性我感觉面试官就问了好多,回答得不是很完整,也不流畅。
确实,基础也是重中之重,树高千尺,营养还是来自根部。平时或许也该多重视基础的夯实。

重写和重载的区别

一篇讲得不错的博客(Java—重写与重载的区别)

重写(Override): 顾名思义就是重新写一遍,重写发生在子类与父类之间。遵守两同两小一大的原则,即要求方法名和形参列表相同,修改方法体;子类方法的返回类型和抛出的异常类应与父类相比更小或相等;子类方法的访问权限应比父类方法的访问权限大或相等。(若父类为private,则不能重写)

访问权限由大到小:public、protected、缺省(default)、private

重载(Overload): 要求方法名相同,形参列表不同,返回值类型可以相同可以不同,但不能以此区分不同的重载函数。

区别: 方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

常见的异常类型有哪些?

这是我的准备盲区,只能对日常开发中碰到的异常进行回忆。

所有的异常类都是由Throwable类继承来的,是所有异常类的共同祖先。
Throwable有两个子类,Error和Exception。Error是无法被处理的,而Exception是可以被处理的。
Exception又可以分为两类,一类是运行时异常(Runtime Exception),一类是编译时异常(非Runtime Exception)。
[Runtime Exception是真实存在的异常类]

Runtime Exception(运行时异常)

  • NullPointerException 空指针异常
  • IndexOutOfBoundsException 索引越界异常
  • ArithmeticException 数学运算异常
  • ClassCastException 类型转换异常
  • SQLException 操作数据库异常

非Runtime Exception(编译时异常)

  • FileNotFoundException 文件未找到异常
  • IOexception IO异常
  • ClassNotFoundException 类未找到异常
  • NoSuchMethodException 方法未找到异常

Java中一个对象的创建过程说一说?(待细化)

概述

(1)JVM读到一个new指令的字节码。
(2)检查指令参数能否在常量池中定位到一个类的符号引用。
(3)若存在,检查符号引用对应的类是否已被加载、解析和初始化。
(4.1)若未被加载,先执行类加载过程。
(4.2)若类已被加载,会为对象分配内存空间(在堆中),同时将指针指向这个对象。(这一步会将除对象头外的变量初始化为0)
(5)对对象进行必要的设置(主要是对象头的设置)。
(6)将对象的引用入栈,放在局部变量表中。
(7)调用Class的< init >方法(执行构造函数,分配对象的状态和资源信息)。

你能自己设计一个线程池吗?

(暂时空着)


Part 2 计算机网络


Cookie和Session的区别说一说?

共同点: 两者都是用来跟踪浏览器用户身份的会话方式。(因为HTTP是无状态的,但在web实际场景中经常需要记住每次请求。)

区别:

  • Cookie数据保存在客户端,Session数据保存在服务器。
  • Cookie不是很安全,外人可以通过分析本地Cookie进行Cookie欺骗。Session安全性更好。
  • Session会在一段时间内存放在服务器上,若访问较多,会加重服务器负担。
  • 建议:敏感信息、重要信息存放在Session,其余需要保留的信息存放在Cookie。

Part 3 数据库


来写一写SQL语句

一张学生成绩表,每个学生姓名对应有有语文、数学、英语三门课,求每个学生的平均分。

SELECT name x, AVG(x.score1+x.score2+x.score3)
FROM table

关键点:每个学生,所以应为name x,还考察了函数的使用,包括avg、min、max、sum等等。

讲一讲数据库事务的四个特性?

见我的文章 MySQL两种引擎的区别 有提到这块内容。


Part 4 实际开发场景


说说JVM调优工具吧?(待细化)

这一块我没有实操过,答得不好。

JDK自带就有调优工具,在jdk文件夹的bin目录下,有一个jvisualvm.exe文件,功能强大,是JVM分析首选。

做过单元测试吗?JUnit用过吗?

见我的文章 基于JUnit的单元测试技术

和团队成员一起开发时,怎么协作代码?

Gitee

项目中的困难说一下?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值