每天五个java相关面试题(9)--java基础详解篇1

时间:2022-03-31 11:06:48

接下来会系统的总结java基础,然后过两天会开始从新开始复习前端并更新和总结一些关于前端的基础知识和面试题,嗯嗯我是一个想走前端的后端java工程师啊哈哈。马上开学大四了,lz我要加油啦~

接下来的面试题会学习我们班小伙伴的好学习方法,一个个刨根问底了,理清楚里面涉及到的知识点。

一、面向对象的特征有哪些方面

答:
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

4.多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。(静态多态是方法重载,动态多态是方法重写)

上面回答中涉及的知识点:

1、封装具体就是三步:第一步是设置对象属性私有化,第二步是创建赋值和取值方法(就是我们常说的get/set方法),第三步在赋值和取值方法中,加入对属性的存取限制(俗称校验)。

2、继承父类一定需要实现父类的方法嘛?
如果父类是抽象类,并且有抽象方法,那么子类必须重写父类的抽象方法,或者子类声明为抽象类。如果父类是个普通类,那么不是必须重写父类的方法。

3、何为抽象类?
使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。(类似于接口)。

4、在继承的时候我们有时候需要重写父类的方法,那么重写和重载的区别是什么?
重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
这里希望大家知道一个词语方法签名 就是由方法名称和一个参数列表(方法的参数的顺序和类型)组成。

二、Collection 和 Collections的区别。

答:
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

上面回答中涉及的知识点:

1、Collection接口在Java 类库中有有哪些具体的实现?
java.util.Collection 是一个集合接口。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set

2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,内部封装了很多对各种集合的搜索、排序、线程安全化等操作,比如对一个list数组内的值进行排序,只需要Collections.sort(list); 即可。

三、String 、StringBuilder、Stringbu和StringBuffer的区别

答:
String和StringBuffer和StringBuilder,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。

上面回答中涉及的知识点:

1、什么是线程安全?
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

四、运行时异常与一般异常有何异同?

答:
Java提供了两类主要的异常:runtime exception (运行时异常)和checked exception (检查异常)。检查异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch

但是另外一种异常:运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。我们不需要进行捕获。

上面回答中涉及的知识点:

1、说出你常见的五种异常?
这个题我们老师说很容易被问到,所有大家可以挑选几个自己记下来,我这里也自己挑选几个了。

  • java.lang.nullpointerexception(”空指针异常”)
  • java.lang.classnotfoundexception(”指定的类不存在”,这里主要考虑一下类的名称和路径是否正确即可)
  • java.lang.arithmeticexception(”数学运算异常”,比如程序中出现了除以零这样的运算就会出这样的异常)
  • java.lang.arrayindexoutofboundsexception(”数组下标越界”)
  • java.lang.illegalargumentexception(”方法的参数错误”)

五、ArrayList,Vector为什么增、删慢,查、改快?而LinkedList查、改、慢,增、删快?

答:
ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。