Java面试题之基础(一)

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

  • 面向对象的特征:继承、封装和多态
* 继承: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运行时出现的问题。应用程序不应该抛出这种错误

  • 请写出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提供对元素流进行函数式操作

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值