欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java面试题之基础(一)

程序员文章站 2024-03-23 19:57:22
...

!!!更多面试题,关注公众号【风清邬】!!!

  • 面向对象的特征:继承、封装和多态
* 继承:A extends B,A则继承了B所有的属性(非private)和方法,A可重写方法,也可扩展自己的属性和方法

* 封装:将数据和基于数据的操作封装在一起,使其构成一个不可分割的对象,数据的操作隐藏在对象内部,只保留一些接口使其与外部发生联系。

    封装的优点:良好的封装减少耦合;类内部的结构可以*修改;隐藏内部信息,实现细节。

* 多态:分为编译时多态和运行时多态。

    编译时多态:主要指方法的重载,它根据参数列表的不同来区分不同的函数;

    运行时多态:当实现多态的三个条件(继承、重写、向上转型)都具备时,指向子类的父类类型引用在真正执行时会执行子类的方法,这样对外表现为使用相同的类当时表现出不同的结果
  • final, finally, finalize 的区别
* final用来作为类、方法、成员变量的修饰符,表明类是不可继承的、方法和成员变量是不可修改的

* finally用在try...catch..finally里,作为异常捕获里最后执行的代码块,一般用于释放资源、关闭连接

* finalize是定义在Object中的方法,子类可以重写这个方法以整理系统资源或者清理工作,方法在垃圾回收器回收这个对象之前调用
  • Exception、Error、运行时异常与一般异常有何异同
* Exception和Error都继承自Throwable

* Exception是所有异常的父类,运行时异常和一般异常都继承自Exception

* 运行时异常:编译期间不会强制要求捕获,通常是可以通过编码避免的异常

* 可检查异常:在源代码中必须进行显示的捕获处理,这是编译器检查的一部分

* Error表现了java运行时系统的内部错误和资源耗尽错误。大部分错误与编写者执行的操作无关,而表示JVM运行时出现的问题。应用程序不应该抛出这种错误

Java面试题之基础(一)

  • 请写出5种常见到的runtime exception
ArrayIndexOutOfBoundsException

NullPointException

ClassNotFoundException

ClassCastException

NoSuchMethodException
  • int 和 Integer 有什么区别,Integer的值缓存范围
* int是基本数据类型

* Integer是对象类型,有一系列的对象方法

    int和Integer可互相转换,称为拆箱封箱操作

* Integer缓存值范围为-128~127
  • 包装类,装箱和拆箱
* 包装类是相对于基本类型而言的,八中基本类型都有相对应的包装类

* 装箱和拆箱操作是在基本类型和其对象类型之间发生的,是一种自动的行为

Integer i = 10; //装箱操作,自动调用 Integer.valueOf(int val) 方法
i = 10; //装箱操作,自动调用 Integer.valueOf(int val) 方法

int n = i; // 拆箱操作,自动调用Integer.intValue()方法
n = i; // 拆箱操作,自动调用Integer.intValue()方法
  • String、StringBuilder、StringBuffer
* String作为一个final类型的对象,可用来表示字符串值,字符串的拼接实际是一个不断产生新的String对象的过程

* StringBuilder在String的拼接过程中,只产生一个对象

* StringBuffer的方法都是synchronized的,相对于StringBuilder而言是线程安全的

 

在执行速度方面:StringBuilder > StringBuffer > String

在线程安全方面:StringBuilder非线程安全;StringBuffer线程安全
  • 重载和重写的区别
* 重载:一个类的多个方法,方法名相同,而参数不同(参数类型、参数个数不同,返回类型可相同也可不同,参数类型不可作为重载函数的判断标准)

* 重写:发生在父子类之间,子类定义的方法与父类拥有相同的名称和参数,这说明该方法被重写
  • 抽象类和接口有什么区别
* 抽象类:以abstract描述的类,一般存在未实现的抽象方法,子类继承抽象类之后,需要实现该抽象方法,如果没有实现,则可以设置子类也为abstract类

* 接口:接口是一种特殊的抽象类,接口里的方法全部为抽象方法,子类实现接口后,需要实现这些方法

 应用场景:

    * 抽象类不能被实例化,只能用作子类的父类,模板模式一般就使用抽象类来实现

    * 如果想实现多重继承,这需要使用接口来实现
  • 说说反射的用途及实现
反射作为JDK的一个优秀特性,可作为一种特殊的实现方式来实现对类的操作。

在运行态中,针对于任何一个类,我们能获取这个类的属性和方法,并且能调用对象的方法。

我们常用的Spring框架就使用了反射,通过使用反射来获取类的实例;

实现:获取类的Class对象,可通过Class来获取类的属性、方法,并可通过Class对象来创建实例
  • 说说自定义注解的场景及实现
我们在使用框架如Spring、Mybatis时都会用到很多注解,注解可以在类上、方法上、成员变量上。

一般来说,使用注解可以为类添加许多附加功能。

Spring的Controller、Service注解,主要就是让Spring在扫描包下的类的时候,针对于添加了这些注解的类这注册到Spring容器中
  • HTTP请求的GET与POST方式的区别
HTTP的请求类型有很多种方式,常用的就是GET和POST,其他还有PUT/DELETE/HEAD等

GET:一般用于查询操作,参数拼接在URL上

POST:一般用于添加或更新操作,参数可作为http请求的body来放入,

可以从安全性、参数传输长度等方面来分析其区别
  • Session与Cookie区别
在常规的Web开发中,经常会使用到Session和Cookie

* Session可被看做是一次会话,当session过期或session关闭的时候会话结束,我们在开发中可以使用session传递一些参数

* Cookie是使用在客户端的,相对而言,session是使用在服务器端的。最经典的Cookie使用方式是:在Cookie中存放session_id,将Cookie和Session的联合使用,实现http请求的连续性交易
  • 列出自己常用的JDK包
java.lang

java.io

java.nio

java.util

java.util.concurrent
  • MVC设计思想
在Web开发中的一个经典开发思想

model-view-controller

将web项目分成不同的层次,每个层次之间对外提供接口访问,实现一种高内聚低耦合。

主要要体会到MVC的分层思想,在实际的代码开发中需要注意到
  • equals与==的区别
* equals比较的是两个对象的值是否相同

* == 比较的是两个对象的对象内存地址是否相同
  • hashCode和equals方法的区别与联系
hashCode和equals是Object的两个方法,hashCode主要是为了获取对象的哈希值;equals这比较两个对象是否相等(内存地址意义上的相同)

equals方法相等这hashCode一定相等;但是hashCode相等equals方法不一定相等

注意:hashCode和equals方法都是为了比较对象是否相等的,那么为什么需要两个方法了?

equals的比较相对复杂点,而hashCode的比较相对简单,但是equals的比较更严谨,hashCode就不那么严谨了。所以,针对大量的对象比较,如果都用equals比较的话,显然效率比较低,所以,一般先用hashCode进行比较,如果hashCode不同则两个对象肯定不同;如果hashCode相同,则再进行equals比较。

用户一般不需要重写hashCode和equals方法,如果要重写的话,这两个都要重写
  • 什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用
java序列化:将对象转换为字节流的过程

反序列化:将字节流转换为对象的过程

序列化的用途:将对象的字节序列保存到硬盘上;在网络上传输对象的字节序列。

java实现序列化:对象实现Serializable接口,然后使用流处理操作ObjectInputSteam和ObjectOutputStream来进行序列化操作
  • Object类中常见的方法,为什么wait  notify会放在Object里边?
toString()/hashCode()/equals()/clone()

wait方法暂停的是持有对象的锁,所以要调用wait方法必须为object.wait()

同理:notify方法唤醒的是等待锁的对象
  • Java的平台无关性如何体现出来的
最主要的是JDK的部署,JDK扮演了java程序与所在硬件平台和操作系统之间的缓冲角色。这样java程序只需要与JDK打交道而不用管具体的操作系统

体现在:我们只需要编写java程序,如果需要在不同的平台运行,那么首先在对应平台安装JDK,然后将打包后的应用运行在JDK上即可,与操作系统无关
  • JDK和JRE的区别
JDK包含JRE,JRE是java运行时环境,包含了JVM

JDK不仅仅有JRE,同时还有java源码、编译器javac、java程序调试工具jconsole等,可以进行开发调试工作
  • Java 8有哪些新特性
* lambda

* java.util.Stream提供对元素流进行函数式操作

!!!更多面试题,关注公众号【风清邬】!!!