Java基础面试题(1)

172 阅读4分钟

一、Java面向对象特征

面向对象编程是利用类和对象编程的一种思想。类是对世界万物的高度抽象。
有三大特征:封装、继承、多态。

  1. 封装:说明一个类行为和属性与其他类的关系;高内聚、低耦合。
  2. 继承:父类和子类的关系。
  3. 多态:类与类之间的关系。

封装

封装隐藏了类的内部实现机制,可在不影响使用的情况下改变类的内部结构,同时也保护了数据

  • 属性的封装:只能通过事先定制好的方法来访问数据,可以方便地加入逻辑控制,限制对属性的不合理操作。
  • 方法的封装:按照既定的方式调用方法,不用关心方法的内部实现,便于使用与修改、增强了代码的可维护性。

继承

继承是从已有的类中派生出新的类,新的类吸收已有类的数据属性和行为,并能扩展新的能力。

子类继承父类说明子类是一种特殊的父类,并且具有父类所不具有的属性和方法。

Java通过 extends 关键字来实现继承,父类中通过 private 定义的变量和方法不会被继承,不能在子类中直接操作父类通过 private 定义的变量和方法。

继承避免了对一般类和特殊类之间共同特征进行的重复操作,增强了代码的复用性。 通过继承可以清晰的表达对每一项特征所适用的概念范围。运用继承原则使得系统模型比较简练也比较清晰。

多态

封装和集成最后归结于多态。多态是指类和类之间的关系,两个类有继承关系,存在方法的重写。故而在调用时有父类引用指向子对象。

增加了代码的可移植性、健壮性、灵活性。

多态必备的三个条件:继承、重写、父类引用指向子对象。


二、ArrayList 和 LinkedList 的区别?

不同点

  • 检索访问ArrayList 是基于索引的数据接口,他的底层是数组。它可以以 O(1) 时间复杂度对元素进行随机访问;与此对应 LinkedList 是以元素列表的形式存储它的数据,每一个元素都和他前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是 O(n)
  • 插入删除:相对于 ArrayListLinkedList的插入、添加、删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或是更新索引。
  • 内存占用LinkedListArrayList 更占内存,因为 ArrayList 中的每个索引的位置是实际的数据, 而 LinkedList 的每个节点中存储的实际上是实际的数据和前后节点的位置(一个 LinkedList 实际存储了两个值: Node<E> firstNode<E> last 分别表示链表的实际节点和为节点,每个Node 实例都存储了三个值: E item , Node next, Node pre)。

适用场景

适用于 LinkedList 的情况为:

  1. 你的应用不会随机访问数据。因为你需要 LinkedList 中的第 n 个元素的时候,你需要从第一个元素顺序数到第 n 个数据,然后读取数据。
  2. 你的应用更多的插入和删除元素,更少的读取数据。因为插入和删除元素不涉及重排数据,比 ArrayList 要快。

三、Java中抽象类和接口有什么区别?

相同点

  1. 不能被实例化。
  2. 可以将抽象类和接口类型作为引用类型。
  3. 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。

不同点

标题抽象类接口
构造器可以定义构造器不能定义构造器
方法可以有抽象方法和具体方法全部都是抽象方法
访问权限private默认protectedpublic全部是 public
成员变量可以定义成员变量定义的成员变量实际上都是常量
静态方法可以包含静态方法不能有静态方法
继承或实现一个类只能继承一个抽象类一个类可以实现多个接口
定义有抽象方法的类必须被声明为抽象类,而抽象类未必有抽象方法

除了语法上的区别还有语义上的区别

比如什么时候使用抽象类,什么时候使用接口?

抽象类:更重点的描述的是一个抽象的概念,是我们平时能想象到的(动物、植物、食物),即人类有既有概念的。

接口:描述的是某些共同事物之间具有的共同 特征(会飞的)。


JDK 1.8 的新特性有哪些?

待补充...