Java面试题整理(浙江通策集团校招…

1、对编程语言的看法

       对于一门编程语言来说,它本身的好坏没必要去细究,因为不同的语言有不同的历史,不同的优缺点和不同的应用领域。就Java语言来说,它是一门典型的面向对象程序设计语言,其一个显著的优势就是平台无关性。不像一般的编译型或者解释型高级语言一样,只能在特定的平台上运行,Java语言编译后产生的是平台无关的字节码文件,通过JVM屏蔽了那些与特定平台相关的东西,使得Java程序可以“一次编译,到处运行”。对于学习一门编程语言的人来说,理解原理非常重要,一定要理解为什么,例如接口、多线程,理解了为什么之后,就要上升到设计这个层次,毕竟学习是为了使用的。了解了基本的设计之后,可以看一看设计模式什么的。当然,在整个过程中,动手实践时最重要的,写代码是必须的。

2、在实际项目中遇到的问题和解决的办法

       关于这个问题没有统一的答案,谁也不知道你做过什么项目,在项目中担任了那些角色,遇到了什么样的问题,有没有解决掉以及如何解决的。建议大家在以后做具体项目的时候,为了应付这样的问题,可以在实际开发过程中做一定的笔记,这样既可以作为宝贵经验积累下来,还可以应付面试时遇到的这种苦逼的问题。

3、关于线程。线程有哪两种实现方式?线程的生命周期是怎样的?

       线程的实现有两种方式,一是继承Thread类,而是实现Runable接口。其中Thread类也是实现了Runable接口的。线程的生命周期可以分为四个部分:新建——就绪(阻塞)——运行——死亡。当用new创建一个线程实例时,线程就处于“新建”状态;当调用了线程的start()方法之后,线程就处于“就绪”状态;如果处于就绪状态的线程获得了CPU的时间片,则线程开始执行run()方法里的线程体,线程处于“运行”状态;当线程调用了sleep()或者调用了一个阻塞式IO方法(如serverSocket的accept())等,线程将处于“阻塞”状态;当如果线程的run()方法体执行完毕,或者抛出一个未捕获的异常等原因,则线程将处于“死亡状态”。

4、抽象与接口的区别

       抽象和接口都不能创建实例。抽象类定义了一些通用的功能,一些抽象的概念,但是不同的子类可能会有不同的实现,是子类的模板;接口是更彻底的抽象,定义了多个类共同的行为规范。从设计层面来看,二者还是有比较大的区别的。抽象体现的是Java中的继承关系,要想使得继承关系合理,父类和子类应该一种“is-a“的关系,即父类和子类本质上应该是相同的,而对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口所定义的契约而已,更像是一种“like-a”的关系。

抽象类中可以有抽象方法和非抽象方法,而接口中只能有抽象方法;抽象类中可以包含属性、方法、构造器、初始化块,内部类,枚举类6中成分,而接口中不能包含构造器和初始化块,而且接口中的属性只能是常量,方法只能是抽象实例方法,接口中的属性不管是否使用public static final修饰符,系统将会自动为这些属性添加这些修饰符,不管接口里的方法是不是用public abstract来修饰,系统总会自动的添加这些修饰符。

一个类只能继承一个抽象类,但可以实现多个接口;另外值得注意的一点是,接口可以继承多个父接口,这与我们熟知的Java单继承有点出入。

5、Java事务的概念,如何保证事务的一致性?

       事务是由一步或几步数据库操作序列组成的逻辑执行单元,这一系列操作要么全部执行要么全部放弃。事务的四个基本特性:原子性(Atomicity),一致性(Consistentcy),隔离性(Isolation),持续性(Durability),ACID。原子性是指事务是应用中不可再分的最小逻辑执行体;一致性是指事务的执行结果,必须是数据库从一个一致性状态变到另一个一致性状态,一致性是通过事务的原子性来保证的;隔离性是指各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务来说都是隔离的;持续性是指事务一旦提交,对数据库所做的任何改变,都要记录到永久的存储器中,通常是数据库中。

       JDBC提供了事务支持。JDBC连接的事务有Connection提供支持,Connection默认打开自动提交,也就是关闭事务,在这种情况下,每条SQL语句一旦执行,便会立即提交到数据库,无法回滚。可以在执行SQL语句之前调用Connection的setAutoCommit(false)方法来关闭自动提交,开启事务,然后在一系列SQL语句体后调用Connection的commit()方法来提交事务,如果任意一条SQL语句执行失败,可以用Connection的rollBack()开回滚事务。当Connection遇到一个未处理的SQlException异常时,系统将会非正常退出,这是系统会自动回滚事务,比如某条SQL语句没有执行成功,如果程序显示捕捉了可能会出现的异常,则应该在异常处理块中显示的调用rollBack()方法回滚事务。

6、类的初始化基本知识,静态变量,初始化快,构造器,实例变量在类初始化时的执行顺序是怎样的?

       类的初始化分为加载、连接、初始化三个步骤。

系统可能在第一次使用一个类时加载这个类,也可能采用预先加载机制来预加载某个类。类的加载指的是将类的class文件读入内存中,并为之创建一个java.lang.Class对象,类的加载有类加载器完成,类加载器通常由JVM提供,成为系统类加载器,开发者也可以通过继承ClassLoader类来自定义类加载器。

类加载成功后,系统为该类生成一个Class对象,接着将会进入连接阶段。连接阶段将会负责把类的二进制数据合并到JRE中。

JVM初始化一个类的步骤:a、假如这个类还没被加载和连接,那么闲加载并连接该类;b、假如该类的直接父类还没有被初始化,则先初始化其直接父类;c、假如该类中有初始化语句,则系统依次执行这些初始化语句。

注意一个特殊的地方,一般情况下,访问一个类的属性、调用一个类的方法或者初始化其子类时,该类都会被先初始化,但如果一个类有静态的final属性,且这个属性在编译时就得到属性值,则可以认为该属性被当成编译时常量,当程序使用编译时常量时,系统会认为是对这个类的被动使用,所以不会导致发i类的初始化!

初始化顺序:静态初始化快和静态变量声明时赋初值是同一个级别的,二者将按照先后的顺序执行,等静态部分初始化完成后,初始化构造器,然后在生成实例的时候初始化成员变量。

7、servlet生命周期是什么?线程安全么?

       servlet生命周期:客户端浏览器向容器发出请求,容器将请求封装成一个HttpServletRequest对象,并寻找对应的servlet实例,如果找到则调用其service()方法,找不到则生成一个servlet实例,并调用其init()方法初始化这个servlet。执行完成后,当servlet不再需要时,容器将在销毁该实例之前调用其destroy()方法,然后销毁该实例。

       servlet不是线程安全的,因为多个请求可以共享一个servlet实例,调用其service方法。所以不建议在servlet类中添加成员变量。

8、Java中有哪些常用的设计模式,列举一二

       Java中有23种设计模式,如工厂模式,代理模式、单例模式、策略模式等。

       工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例

    单例模式:单例模式通过在类中定义一个私有的构造方法来在类的内部生成一个单实例,提供一个静态的公共方法用来供外界获取这个实例,这个类只能存在一个实例。

9、Java分为哪几大体系。JDK是什么?

       Java一般认为分为三大体系,分别是Java SE(Java标准版) 、Java EE(Java企业版)、Java ME(Java精简版),分别对应Java基础、Java网络应用和嵌入式开发。JDK是Java标准开发包,它提供了编译、运行Java程序所需要的各种工具和资源

10、方法的重写和重载的区别是什么?

       在同一个类中定义方法名相同而参数列表不同的方法叫做方法重载,在子类中定义域父类方法名相同参数列表相同的方法叫做方法的重写。重载的标识是:方法名相同、参数列表不同,不关心返回值和权限修饰符。但Java不允许在一个类中有方法名和参数列表相同,而返回值类型或者权限修饰符不同的方法,因为Java区分两个方法的标识就是参数列表和方法名,不关注其他的。重写时要注意“两同两小一大”原则,即方法名和参数列表相同,返回值类型更小或相等(同类或其子类),抛出异常更小或相等,权限修饰符更大或相等。重写成功后,子类中的方法将覆盖从父类中继承来的方法,子类的对象也不可直接访问到父类中继承而来的原方法。其实二者没有什么本质的联系,也无从谈起区别,只要知道各自的用法即可。

11、如何从数据库连接池中获取一条数据库连接?

       先要配置数据库连接池,如Tomcat数据源,在Context.xml中配置连接池,然后写一个工具类用来获取数据库连接。获取的方式为先获得上下文环境,然后通过DataSource接口的一个实例,通过调用其getConnection()方法来获取一条数据库连接。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值