你的位置:首页 > Java教程

[Java教程]java面试题总结(一)

java的接口类和抽象类的特点

java中抽象类的特点:

1. 如果一个类中有抽象方法,那么这个类一定是抽象类

2. 抽象类中不一定有抽象方法

3. 抽象类中可以存在抽象方法

4. 抽象类中可以存在构造方法

5. 抽象类中可以存在普通属性、方法、静态属性和静态方法

6. 抽象类中的抽象方法需要有子类实现,如果子类不实现,则子类也需要定义为抽象的 

java中接口的特点:

1. 接口中的方法,永远都被public来修饰

2. 接口中没有构造方法,也不能实例化接口对象

3. 接口中只有方法的声明,没有方法体

4. 接口中只有常量,如果定义变量,在编译的时候都会默认加上“public static final”

5. 接口中定义的方法都需要实现类来实现,如果实现类不能实现接口中的所有方法,则实现类需要定义为抽象类

6. 静态方法不能被子类重写(覆盖),因此接口中不定声明静态方法

7. 使用接口可以实现多继承

接口和抽象类的区别之处:

1. 接口中所有的方法隐含都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法

2. 类可以实现很多个接口,但是只能继承一个抽象类

3. 类可以不实现抽象类和接口声明的所有方法,在这种情况下,类也必须得声明成是抽象的

4. 抽象类可以在不提供接口方法实现的情况下实现接口

5. java接口中声明的变量默认都是final的,抽象类可以包含非final变量

6. java接口中的成员函数默认都是public的,抽象类中的成员函数可以是private,protected或者是public的

7. 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是如果它包含main方法的话是可以被调用的

转自 >接口是否可继承接口?抽象类是否可实现接口?抽象类是否科技城实体类(concrete class)

1、接口是可以被接口继承的,即通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是public,子接口将继承父接口中的全部方法和常量。
2、抽象类可以实现接口,当一个类声明实现一个接口而没有实现接口中所有的方法,那么这个必须是抽象类,即abstract类。
3、抽象类是可以继承实体类。

 

 

构造器Cintructor是否可被override?是否可以被overload?

Constructor不能被继承,所以Constructor也就不能被override,但是可以overload

 

 

java垃圾回收的优点和原理,写出两种垃圾回收可调用的方法

 java垃圾回收的优点:

它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存.

 java垃圾回收的原理: 

垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

两种方法是

System.gc()

Runtime.gc()

 

 

请说出你所知道的线程中常用的方法

(1)wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

(2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉 InterruptedException异常。

(3)notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的 唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

(4)notityAll ():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁, 而是让它们竞争。

 

 

Error与Exception的区别

Error表示系统级的错误和程序不必处理的异常, Exception表示需要捕捉或者需要程序进行处理的异常

 

 

在java中一个类被声明为final类型,表示了什么意思

意味着它不能再派生出新的子类,不能作为父类被继承

 

 

谈谈final,finally,finalize的区别

(1)final—修饰符(关键字)

如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此 一个类不能既被声明为 abstract的,又被声明为final的。

将变量或方法声明为final,可以保证它们在使用中不被改变。

被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改.被 声明为final的方法也同样只能使用,不能重载。

(3)finally—再异常处理时提供 finally 块来执行任何清除操作。

如果抛出一个异常,那么相 匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

(4)finalize—方法名。

Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除 出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这 个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之 前对这个对象调用的。 

 

 

HashMap和Hashtable的区别

转自:https://www.cnblogs.com/langtianya/archive/2013/03/19/2970273.html

hashmap

线程不安全

允许有null的键和值

效率高一点、

方法不是Synchronize的要提供外同步

有containsvalue和containsKey方法

HashMap 是Java1.2 引进的Map interface 的一个实现

HashMap是Hashtable的轻量级实现

hashtable

线程安全

不允许有null的键和值

效率稍低、

方法是是Synchronize的

有contains方法方法

Hashtable 继承于Dictionary 类

Hashtable 比HashMap 要旧

 

 

数组有没有length()这个方法?String有没有length()这个方法

数组没有length()这个方法,有length的属性。String有有length()这个方法。

int a[];a.length;//返回a的长度String s;s.length();//返回s的长度

 

 

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

重载(Overload):发生在一个类中,方法名相同,参数列表不同,方法体不同

重载遵循"编译期"绑定,看引用的类型来绑定方法

可以改变返回值的类型:

public class OverLoadTest { public void m1(int x){ } public int m1(int x,int y){  return 12; } public String m1(int x,int y,int z){  return "abc"; } public int m1(String x,int y){  return 12; }}  

重写(Override):发生在父子类中,方法名相同,参数列表相同,方法体不同

重写遵循"运行期"绑定,看对象的类型来调用方法

重写的两同两小一大:

两同:1)方法名2)形参列表

两小:1)返回值类型

               基本类型和void:子类与父类的返回值类型必须相等

               引用类型:子类的返回值类型比父类更小

          2)异常比父类方法更小或相等

一大:子类权限比父类大或相等

 

 

作用域public ,private , protected以及default的区别

(1)public:可以被所有其他类所访问。

(2)private:只能被自己访问和修改。

(3)protected:自身,子类及同一个包中类可以访问。

(4)default(默认):同一包中的类可以访问,声明时没有加修饰符,认为是friendly

 

 

Jsp有那些内置对象?作用分别是什么

 

名称

作用

request

包含用户端请求的信息

response

包含服务器传回客户端的响应信息

session

与请求有关的会话期

pageContext

管理网页属性

application

服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息

out

向客户端输出数据

config

servlet的架构部件

page

指网页本身

exception

针对错误页面才可使用

JAVA SERVLET API 中forward()与redirect()的区别

转发与重定向

(1)从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

(2)从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

(3)从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

(4)从效率来说

forward:高.

redirect:低.

 

 

MVC的各个部分都有哪些技术来实现?如何实现?

Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),

View 是应用的表示面(由JSP页面产生),

Controller 是提供应用的处理过程控制(一般是一个Servlet)

通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

 

 

说出Servlet的生命周期

1)创建Servlet对象,通过服务器反射机制创建Servlet对象,第一次请

求时才会创建。(默认)

2)调用Servlet对象的init()方法,初始化Servlet的信息,init()方法只会在创建后被调用一次;

3)响应请求,调用service()或者是doGet(),doPost()方法来处理请求,这些方法是运行的在多线程状态下的。

4)在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。

 

 

数据库中存储过程和函数的区别1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。

2、函数中有返回值,且必须返回,而过程可以没有返回值。

3、过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除在select中,必须将返回值赋给变量。

4、函数可以在select语句中直接使用实现对字段进行计算,而存储过程不能,例如:假设已有函数fun_getAVG() 返回number类型绝对值。那么select fun_getAVG(col_a) from table 这样是可以的。

5、函数一般处理简单的逻辑方便,存储过程一般处理复杂的逻辑,

 

 

事务是什么?谈谈sprig中的事务传播机制和隔离级别

事务:

事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。

事务应该具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性.

原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability):持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

Spring事务传播机制

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播

即协调已经有事务标识的方法之间的发生调用时的事务上下文的规则(是否要有独立的事务隔离级别和锁)

 

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

四种隔离级别:

① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

③ Read committed (读取已提交的):可避免脏读的发生。

④ Read uncommitted (读取未提交的):最低级别,任何情况都无法保证。

 

 

给你一个:驱动程序A,数据库源名称为B,用户名称为C,密码为D,数据库表为T,请用JDBC检索出T表的所有数据

 

package jdbcTest;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/** * 给你一个: * 驱动程序A * 数据库源名称为B * 用户名称为C * 密码为D * 数据库表为T * 请用JDBC检索出T表的所有数据 * @author 梦过之后 * */public class test1 { /**驱动程序A*/ public static final String className = "A"; /**数据库源名称为B*/ public static final String url = "B"; /**用户名称为C*/ public static final String user = "C"; /**密码为D*/ public static final String pwd = "D";  public static void main(String[] args) {  //数据库连接  Connection conn = null;  try {   //加载驱动程序   Class.forName(className);   //创建与数据库的连接   conn = DriverManager.getConnection(url,user,pwd);   //实例化Statement对象   Statement stm = conn.createStatement();   //创建sql语句   String sql = "SELECT * FROM T";   //执行数据库操作并返回结果到rs   ResultSet rs = stm.executeQuery(sql);   //遍历并输出查询到的结果   while(rs.next()){    System.out.println(rs.toString());   }   //关闭数据库操作   stm.close();   //关闭连接   conn.close();  } catch (ClassNotFoundException | SQLException e) {   e.printStackTrace();  } } }