Java面试题整理

Java基础部分

  • Java的基本数据类型有哪些?String是基本数据类型?

共八种:
byte(8位),short(16位),int(32位) 默认值 0
long(64位) 默认值 0L
float(32位) 默认值 0.0f
double (64位) 默认值 0.0d
boolean(1位) 默认值 false
char(16位) 单一的Unicode字符
String不是基本类型,引用类型的对象。

  • 一个“.java”源文件中是否可包含多个类?有什么限制?

一个java文件中可包含多个类,但只能有一个public类,且其类名与文件名相同。

  • &和&&的异同

同:&和&&和都可以作逻辑与运算符
异:
&&作逻辑与运算符时具有短路功能
&可用作位的与运算符

// 若str为null时,不会抛出异常,因短路,equals不执行
if(str != null && !str.equals(""))
// 若若str为null时,抛出NullPointerException异常,equals执行
if(str != null & !str.equals(""))
  • switch语句能否作用在byte上,能否用在long,String上?

switch(expr)中变量类型可以是byteshortintchar及对应的包装类
从JavaSE 5 后可以是枚举类型
从JavaSE 7后可以支持String
不可用作longdoublefloatboolean及其包装类上

  • short s1 = 1;s1 = s1+1;有什么错?short s1 = 1;s1+=1;呢?

前者会报需要强制转换类型的错,因:

short s1 = 1;
// s1 + 1运算时结果会转化为int类型
// int无法自得转为short
s1 = s1 + 1;

后者编译通过,因:
在Java中编译器会对s1 += 1作特殊处理
(Tyep) a + = b操作等于(Type) a = (Type)(a + b)
所以已经转型过了,无错误。

  • 使用final关键字修饰一个变量时,时引用不能变,还是引用对象不能变?

final修饰的变量,引用不能变,但引用的对象能变

https://www.cnblogs.com/guweiwei/p/6594552.html
补充: final关键字

  • “==”和equals方法的区别?

操作符专门用来比较两个变量的值是否相等, 也就是用于比较变量所对应的内存中所存
储的数值是否相同, 要比较两个基本类型的数据或两个引用变量是否相等, 只能用
操作
符。
如果一个变量指向的数据是对象类型的, 那么, 这时候涉及了两块内存, 对象本身占用一块
内存(堆内存) , 变量也占用一块内存, 例如 Objet obj = new Object();变量 obj 是一个内存,
new Object()是另一个内存, 此时, 变量 obj 所对应的内存中存储的数值就是对象占用的那块
内存的首地址。 对于指向对象类型的变量, 如果要比较两个变量是否指向同一个对象, 即要
看这两个变量所对应的内存中的数值是否相等, 这时候就需要用操作符进行比较。
equals 方法是用于比较两个独立对象的内容是否相同, 就好比去比较两个人的长相是否相
同, 它比较的两个对象是独立的。 例如, 对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条 new 语句创建了两个对象, 然后用 a,b 这两个变量分别指向了其中一个对象, 这是两个
不同的对象, 它们的首地址是不同的, 即 a 和 b 中存储的数值是不相同的, 所以, 表达式
a
b 将返回 false, 而这两个对象中的内容是相同的, 所以, 表达式 a.equals(b)将返回 true。

  • 静态变量和实例变量的区别?

语法定义上的区别:静态变量要用static修饰,实例变量不用;
程序运行时的区别:静态变量在加载字节码文件时就会分配到空间,而实例变量要创建对象后才分配空间。
使用时的区别:静态变量通过类名.变量调用,实例变量对象.变量调用。

  • 是否可从一个static方法内发出对非static方法的调用?

不可以,要调用非static方法必须要有对象,但调用static方法时可能还没有产生对象。

  • Integer与int的区别?

Integerint的封装类,Integer的默认值为null,int的默认值为0
Integer可区分0和null的情况,int则不行
Integer中还提供了多个与整数相关的方法。

  • Overload和Override的区别,Overloaded的方法是否可以改变返回值的类型?

Overload是方法重载,指同一类中可以有多个相同名称的方法,但参数不同,返回值可相同也可不同。
Override是方法重写,指子类在继承父类时,重写父类中的同名同参的方法,相当于将其方法内容覆盖。但子类只能抛出比父类更少的异常,或者父类的子异常。

  • Servlet的生命周期?

Servlet 被服务器实例化后,容器运行其 init 方法, 请求到达时运行其 service 方法, service方法自动派遣运行与请求对应的 doXXX 方法(doGet, doPost) 等, 当服务器决定将实例销毁时候调用其 destroy方法。

  • 面向对象编程的特性?

抽象,封装,继承,多态

  • 接口和抽象类的区别?

1.接口中所有的方法都是抽象的,而抽象类里既可以有抽象方法,也可有非抽象方法;
2.类可以实现多个接口,但只能继承一个抽象类;
3.抽象类可以在不提供接口方法的情况下实现接口;
4.接口中声明的变是默认是final的,抽象类可包含非final的变量;
5.接口和抽象类都不可以被实例化,但抽象类中若有main方法的话是可被调用的。

  • 创建线程有几种不同的方式

1.继承Thread类;
2.实现Runnable接口;
3.可使用Executor框架来创建线程池

Spring相关

  • Spring的工作原理?
    1.spring mvc的请求会提交到DispatcherServlet,它会委托应用系统的其它模块对请求进行真正的处理;
    2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controler;
    3.DispatcherServlet的请求到到达目标Controller;
    4.Controller进行业务逻辑的处理后返回一个ModelAndView;
    5.Dispatcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图;
    6.视图对象负责渲并返回个客户端。

  • 解释下DI和IOC
    1.IOC即控制反转,也就是说对象的创建的控制不是角由对象内容部控制,而是交给容器去控制。比如对象的创建部是通过new进行创建,而是通过交给IOC容器创建。
    优点:有IOC容器后查找和创建依赖对象的控制权都了容器方,使对象间松散耦合,方便测试,利于功能复用。
    3.DI即依赖注入,是容器动态的将某依赖关系注入到组件中。具体的说就是IOC容器将对象注入到程序中。

IOC与DI

  • 什么是AOP,AOP的作用是什么?
    AOP是切面编程,能够在不影响原有功能的前提下,为软件拓展功能。

AOP

  • Spring框架有哪些不同的模块?
    1.核心容器模块
    2.应用上下文模块(ApplicationContext)
    3.AOP模块
    4.JDBC抽象和DAO模块
    5.WEB模块
    6.MVC模块

  • Spring里如何配置数据库驱动?

<bean id=”dataSource”>
    <property name=”driverClassName”>
        <value>org.hsqldb.jdbcDriver</value>
    </property>
    <property name=”url”>
        <value>jdbc:hsqldb:db/appfuse</value>
    </property>
    <property name=”username”><value>sa</value></property>
    <property name=”password”><value></value></property>
</bean>
  • 解释下Bean的生命周期?
    1.Spring对bean进行实例化,默认bean是单例;
    2.Spring对bean进行依赖注入;
    3.如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法;
    4.如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来;
    5.如果bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;
    6.如果bean实现了BeanPostProcessor接口,它的postProcessBeforeInitialization方法将被调用;
    7.如果bean实现了InitializingBean接口,spring将调用它的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,该方法也会被调用;
    8.如果bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法将被调用;
    9.此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
    10.若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;

参考

  • JavaBean和SpringBean的区别?
    JavaBean是一种JAVA语言写的可重用组件。JavaBean符合一定规范写的Java类,是一种规范。它的方法命名,构造以及行为必须符合特定的要求:
         1.所有属性为private
         2.这个类必须具有一个公共的(public)无参构造函数
         3.private属性必须提供public的getter和setter来给外部访问,并且方法的命名也必须遵循一定的命名规范
         4.这个类是可序列化的,要实现serializable接口
    SpringBean是受Spring管理的对象 所有能受Spring容器管理的对象都可以成为SpringBean.
原文地址:https://www.cnblogs.com/flytree/p/11628289.html