1基础篇1.1基本功1.1.1面向对象特征封装,继承,多态和抽象1、封装封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。下面列出了使用封装的一些好处:1)通过隐藏对象的属性来保护对象内部的状态。2)提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。3)禁止对象之间的不良交互提高模块化2、继承继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。3、多态多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。4、抽象抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。1.1.2final,finally,finalize的区别1、final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。2、finally在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。3、finalize方法名。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。1.1.3int和Integer有什么区别int是基本数据类型,而Integer是其包装类,注意是一个类。为什么要提供包装类呢???一是为了在各种类型间转化,通过各种方法的调用。否则你无法直接通过变量转化。1.1.4重载和重写的区别override(重写)1.方法名、参数、返回值相同。2.子类方法不能缩小父类方法的访问权限。3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。4.存在于父类和子类之间。5.方法被定义为final不能被重写。overload(重载)1.参数类型、个数、顺序至少有一个不相同。2.不能重载只有返回值不同的方法名。3.存在于父类和子类、同类中。区别点重载重写(覆写)英文OverloadingOveriding定义方法名称相同,参数的类型或个数不同方法名称、参数类型、返回值类型全部相同权限对权限没要求被重写的方法不能拥有更严格的权限范围发生在一个类中发生在继承类中1.1.5抽象类和接口有什么区别接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。1.1.6说说反射的用途及实现Java反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架Java反射的主要功能:-确定一个对象的类-取出类的modifiers,数据成员,方法,构造器,和超类.-找出某个接口里定义的常量和方法说明.-创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).-取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.-在运行时刻调用动态对象的方法.-创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.反射的应用很多,很多框架都有用到spring的ioc/di也是反射….javaBean和jsp之间调用也是反射….struts的FormBean和页面之间…也是通过反射调用….JDBC的classForName()也是反射…..hibernate的find(Classclazz)也是反射….反射还有一个不得不说的问题,就是性能问题,大量使用反射系统性能大打折扣。怎么使用使你的系统达到最优就看你系统架构和综合使用问题啦,这里就不多说了。来源:说说自定义注解的场景及实现登陆、权限拦截、日志处理,以及各种Java框架,如Spring,Hibernate,JUnit提到注解就不能不说反射,Java自定义注解是通过运行时靠反射获取注解。实际开发中,例如我们要获取某个方法的调用日志,可以通过AOP(动态代理机制)给方法添加切面,通过反射来获取方法包含的注解,如果包含日志注解,就进行日志记录。1.1.8HTTP请求的GET与POST方式的区别1、请求数据的方式GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。POST请求会把请求的数据放置在HTTP请求包的包体中。因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。2、传输数据的大小在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。3、安全性POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-siterequestfrogery攻击4、HTTP中的GET,POST,SOAP协议都是在HTTP上运行的参考:与Cookie区别cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。下面列出了session和cookie的区别:无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用cookie,但是,session仍然是能够工作的,因为客户端无法禁用服务端的session。1.1.10JDBC流程1、加载JDBC驱动程序:在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(StringclassName)实现。例如://加载MySql的驱动类Class.forName(com.mysql.jdbc.Driver);成功加载后,会将Driver类的实例注册到DriverManager类中。2、提供JDBC连接的URL-连接URL定义了连接数据库时的协议、子协议、数据源标识。-书写形式:协议:子协议:数据源标识协议:在JDBC中总是以jdbc开始子协议:是桥连接的驱动程序或是数据库管理系统名称。数据源标识:标记找到数据库来源的地址与连接端口。例如://MySql的连接URL,true表示使用Unicode字符集,characterEncoding字符编码方式。jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk;3、创建数据库的连接-要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。-使用DriverManager的getConnectin(Stringurl,Stringusername,Stringpassword)方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。例如://连接MySql数据库,用户名和密码都是rootStringurl=jdbc:mysql://localhost:3306/test;Connectioncon=DriverManager.getConnection(url,root,root)4、创建一个Statement,要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型:1)执行静态SQL语句。通常通过Statement实例实现。Statementstmt=con.createStatement();2)执行动态SQL语句。通常通过PreparedStatement实例实现。PreparedStatementpstmt=con.prepareStatement(sql);3)执行数据库存储过程。通常通过CallableStatement实例实现。CallableStatementcstmt=con.prepareCall(“{CALLdemoSp(?,?)}”);5、执行SQL语句提供了三种执行SQL语句的方法:executeQuery、executeUpdate和execute1)ResultSetexecuteQuery(StringsqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。2)intexecuteUpdate(StringsqlString):用于执行INSERT、UPDATE或DELETE语句以及SQLDDL语句,如:CREATETABLE和DROPTABLE等3)execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。6、处理结果:1)执行更新返回的是本次操作影响到的记录数。2)执行查询返回的结果是一个ResultSet对象。•ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问(列是从左到右编号的,并且从列1开始)。•使用结果集(ResultSet)对象的访问方法获取数据:while(rs.next()){Stringname=rs.getString(“name”);Stringpass=rs.getString(1);//此方法比较高效}7、关闭JDBC对象操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:1)关闭记录集rs.close()2)关闭声明stmt.close()3)关闭连接对象conn.close()1.1.11MVC设计思想M:Model模型V:View视图C:Controller控制器模型就是封