抽象类和接口有什么区别 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以 有私有方法或私有变量的; 另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写 需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到 具体类实现; 还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口 实现多重继承; 接口还有标识(里面没有任何方法,如 Remote 接口)和数据共享(里面的变量全是常 量)的作用。
说说反射的用途及实现 Java 反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有的成 员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架 在运行时构造一个类的对象;判断一个类所具有的成 员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架。 Java 反射的主要功能: 确定一个对象的类 取出类的 modifiers,数据成员,方法,构造器,和超类 找出某个接口里定义的常量和方法说明
创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象) 取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到 在运行时刻调用动态对象的方法 创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值 反射的应用很多,很多框架都有用到: spring 的 ioc/di 也是反射… javaBean 和 jsp 之间调用也是反射… struts 的 FormBean 和页面之间…也是通过反射调用… JDBC 的 classForName()也是反射… hibernate 的 find(Class clazz) 也是反射… 反射还有一个不得不说的问题,就是性能问题,大量使用反射系统性能大打折扣。怎么使用 使你的系统达到最优就看你系统架构和综合使用问题啦,这里就不多说了。 来源:http://uule.iteye.com/blog/1423512
说说自定义注解的场景及实现 (此题自由发挥,就看你对注解的理解了) 登陆、权限拦截、日志处理,以及各种 Java 框架,如 Spring,Hibernate,JUnit。 提到注解就不能不说反射,Java 自定义注解是通过运行时靠反射获取注解。实际开发中,例 如我们要获取某个方法的调用日志,可以通过 AOP(动态代理机制)给方法添加切面,通过 反射来获取方法包含的注解,如果包含日志注解,就进行日志记录。
HTTP 请求的 GET 与 与 POST 方式的区别 GET 方法会把名值对追加在请求的 URL 后面。因为 URL 对字符数目有限制,进而限制了用 在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种 方式传递。 POST 方法通过把请求参数值放在请求体中来克服 GET 方法的限制,因此,可以发送的参数 的数目是没有限制的。最后,通过 POST 请求传递的敏感信息对外部客户端是不可见的。
session 与 与 cookie 区别 cookie 是 Web 服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个 Web 服 务器存储 cookie。以后浏览器在给特定的 Web 服务器发请求的时候,同时会发送所有为该 服务器存储的 cookie。下面列出了 session 和 cookie 的区别: 无论客户端浏览器做怎么样的设置,session 都应该能正常工作。客户端可以选择禁用 cookie,但是, session 仍然是能够工作的,因为客户端无法禁用服务端的 session。
JDBC 流程
加载 JDBC 驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到 JVM(Java 虚拟机),这通过 java.lang.Class 类的静态方法 forName(String className)实现。 例如: try{ //加载 MySql 的驱动类 Class.forName(“com.mysql.jdbc.Driver”) ; }catch(ClassNotFoundException e){ System.out.println(“找不到驱动程序类 ,加载驱动失败!”); e.printStackTrace() ; } 成功加载后,会将 Driver 类的实例注册到 DriverManager 类中。提供 JDBC 连接的 URL 连接 URL 定义了连接数据库时的协议、子协议、数据源标识。 书写形式:协议:子协议:数据源标识 协议:在 JDBC 中总是以 jdbc 开始 子协议:是桥连接的驱动程序或是数据库管理系统名称。 数据源标识:标记找到数据库来源的地址与连接端口。 例如: jdbc:mysql://localhost:3306/test? useUnicode=true&characterEncoding=gbk;useUnicode=true;(MySql 的连接 URL) 表示使用 Unicode 字符集。如果 characterEncoding 设置为 gb2312 或 GBK,本参数必须设置 为 true 。characterEncoding=gbk:字符编码方式。创建数据库的连接 要连接数据库,需要向 java.sql.DriverManager 请求并获得 Connection 对象,该对象就代 表一个数据库的连接。 使用 DriverManager 的 getConnectin(String url , String username , String password )方法传 入指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。 例如: //连接 MySql 数据库,用户名和密码都是 root String url = “jdbc:mysql://localhost:3306/test” ; String username = “root” ; String password = “root” ; try{ Connection con = DriverManager.getConnection(url , username , password) ; }catch(SQLException se){System.out.println(“数据库连接失败!”); se.printStackTrace() ; 4. 创建一个 Statement 要执行 SQL 语句,必须获得 java.sql.Statement 实例,Statement 实例分为以下 3 种类型:
执行静态 SQL 语句。通常通过 Statement 实例实现。执行动态 SQL 语句。通常通过 PreparedStatement 实例实现。执行数据库存储过程。通常通过 CallableStatement 实例实现。 具体的实现方式: Statement stmt = con.createStatement() ; PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ; 执行 SQL 语句 Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。 ResultSet executeQuery(String sqlString):执行查询数据库的 SQL 语句 ,返回一个结果集 (ResultSet)对象。int executeUpdate(String sqlString):用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL 语句,如:CREATE TABLE 和 DROP TABLE 等。execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的 语句。 具体实现的代码: ResultSet rs = stmt.executeQuery(“SELECT * FROM …”) ; int rows = stmt.executeUpdate(“INSERT INTO …”) ; boolean flag = stmt.execute(String sql) ; 处理结果 两种情况: 执行更新返回的是本次操作影响到的记录数。执行查询返回的结果是一个 ResultSet 对象。 ResultSet 包含符合 SQL 语句中条件的所有行,并且它通过一套 get 方法提供了对这些行 中数据的访问。 使用结果集(ResultSet)对象的访问方法获取数据: while(rs.next()){ String name = rs.getString(“name”) ; String pass = rs.getString(1) ; // 此方法比较高效 } (列是从左到右编号的,并且从列 1 开始) 关闭 JDBC 对象 操作完成以后要把所有使用的 JDBC 对象全都关闭,以释放 JDBC 资源,关闭顺序和声明顺序 相反: 关闭记录集关闭声明关闭连接对象 if(rs != null){ // 关闭记录集 try{ rs.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(stmt != null){ // 关闭声明 try{ stmt.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(conn != null){ // 关闭连接对象 try{ conn.close() ; }catch(SQLException e){ e.printStackTrace() ; } }MVC 设计思想 MVC 就是 M:Model 模型 V:View 视图 C:Controller 控制器 模型就是封装业务逻辑和数据的一个一个的模块;控制器就是调用这些模块的(java 中通常 是用 Servlet 来实现,框架的话很多是用 Struts2 来实现这一层);视图就主要是你看到的,比 如 JSP 等。 当用户发出请求的时候,控制器根据请求来选择要处理的业务逻辑和要选择的数据,再返回 去把结果输出到视图层,这里可能是进行重定向或转发等
equals 与 与 == 的区别 值类型(int,char,long,boolean 等)都是用==判断相等性。对象引用的话,判断引用所指的 对象是否是同一个。equals 是 Object 的成员函数,有些类会覆盖(override)这个方法,用 于判断对象的等价性。例如 String 类,两个引用所指向的 String 都是"abc",但可能出现他们 实际对应的对象并不是同一个(和 jvm 实现方式有关),因此用判断他们可能不相等,但用 equals 判断一定是相等的。