Java面试知识点解析-01 —— Java基础知识点

借参加过的多场Java开发面试,应聘岗位均为Java开发方向,在不断的面试中,又仔细对Java知识点进行复习和总结,也算是重新学习一下Java吧。

推荐收藏链接:Java 面试知识点解析


1)面向对象的特性有哪些?

封装、继承和多态(应要多算一个那就是抽象)

  • 封装是指将对象的实现细节隐藏起来,然后通过公共的方法来向外暴露出该对象的功能。

    但封装不仅仅是 private + getter/setter ,使用封装可以对 setter 进行更深层次的定制,例如你可以对执行方法的对象做规定,也可以对数据做一定的要求,还可以做类型转换等等。使用封装不仅仅安全,更可以简化操作。

  • 继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类是一种特殊的父类,能直接或间接获得父类里的成员。

    继承的缺点:
    1)继承是一种强耦合关系,父类变子类也必须变;
    2)继承破坏了封装,对于父类而言,它的实现细节对子类来说都是透明的。

  • 多态简而言之就是同一个行为具有多个不同表现形式或形态的能力。

    比如说,有一杯水,我不知道它是温的、冰的还是烫的,但是我一摸我就知道了,我摸水杯的这个动作,对于不同温度的水,就会得到不同的结果,这就是多态。

    多态的条件:1)继承;2)重写;3)向上转型。

    多态的好处:当把不同的子类对象都当作父类类型来看,可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码达到通用编程,以适应需求的不断变化。

  • 抽象是指从特定的角度出发,从已经存在的一些事物中抽取我们所关注的特性、行为,从而形成一个新的事物的思维过程,是一种从复杂到简洁的思维方式。

2)面向对象和面向过程的区别?

面向过程是一种站在过程的角度思考问题的思想,强调的是功能行为,功能的执行过程,即先干啥,后干啥。

面向过程的设计:最小的程序单元是函数,每个函数负责完成某一个功能,用以接受输入数据,函数对输入数据进行处理,然后输出结果数据。整个软件系统由一个个的函数组成,其中作为程序入口的函数称之为主函数,主函数依次调用其他函数,普通函数之间可以相互调用,从而实现整个系统功能。

  • 面向过程的缺陷:向过程的设计,是采用置顶而下的设计方式,在设计阶段就需要考虑每一个模块应该分解成哪些子模块,每一个子模块有细分为更小的子模块,如此类推,直到将模块细化为一个个函数。

  • 问题:1)设计不够直观,与人类的习惯思维不一致;2)系统软件适应性差,可扩展性差,维护性低。

面向过程最大的问题在于随着系统的膨胀,面向过程将无法应付,最终导致系统的崩溃。为了解决这一种软件危机,我们提出面向对象思想。

面向对象是一种基于面向过程的新的编程思想,是一种站在对象的角度思考问题的思想,我们把多个功能合理的放到不同对象里,强调的是具备某些功能的对象。

  • 面向对象更加符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。在软件工程上,面向对象可以使工程更加模块化,实现更低的耦合和更高的内聚。
  • 注意: 不要粗浅的认为面向对象一定就优于面向过程的设计
3)JDK 和 JRE 的区别是什么?

解析:这是考察一些基本的概念

Java 运行时环境(JRE-Java Runtime Environment),它包括 Java 虚拟机、Java 核心类库和支持文件,但并不包含开发工具(JDK-Java Development Kit)——编译器、调试器和其他工具。

Java 开发工具包(JDK)是完整的 Java 软件开发包,包含了 JRE,编译器和其他的工具(比如 JavaDoc, Java 调试器),可以让开发者开发、编译、执行 Java 应用程序。

4)Java 中覆盖和重载是什么意思?

解析:覆盖和重载是比较重要的基础知识点,并且容易混淆,所以面试中常见。

覆盖(Override)是指子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小,被覆盖的方法不能是 private 的,否则只是在子类中重新定义了一个新方法。

重载(Overload)表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同。

面试官: 那么构成重载的条件有哪些?

答:参数类型不同、参数个数不同、参数顺序不同。

面试官: 函数的返回值不同可以构成重载吗?为什么?

答:不可以,因为 Java 中调用函数并不需要强制赋值。举例如下:

如下两个方法:

void f(){}
int f(){ return 1; }

只要编译器可以根据语境明确判断出语义,比如在 int x = f(); 中,那么的确可以据此区分重载方法。不过, 有时你并不关心方法的返回值,你想要的是方法调用的其他效果 (这常被称为 “为了副作用而调用” ),这时你可能会调用方法而忽略其返回值,所以如果像下面的调用:

f();

此时 Java 如何才能判断调用的是哪一个 f() 呢?别人如何理解这种代码呢?所以,根据方法返回值来区分重载方法是行不通的。

5)抽象类和接口的区别有哪些?
  • 抽象类中可以没有抽象方法;接口中的方法必须是抽象方法;
  • 抽象类中可以有普通的成员变量;
  • 接口中的变量必须是 static final 类型的,必须被初始化,接口中只有常量,没有变量;
  • 抽象类只能单继承,接口可以继承多个父接口;
  • Java 8 中接口中会有 default 方法,即方法可以被实现。

面试官:抽象类和接口如何选择?

  • 如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。
  • 如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。

在这里插入图片描述


我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫描二维码加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/alogtech6/article/details/89453174