基本功

面向对象特征

封装、继承、多态和抽象

1、封装:给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法,来改变它内部的数据。

  在Java中,其访问权限有3种修饰符:public、private、protected。每一个修饰符给其他的位于同一包或者不同包对象都赋予了不同的访问权限。

  好处:

    1、通过隐藏对象的属性,来保护对象内部的状态。

    2、提高了代码的可用性和可维护性,因为对象的行为可以被单独改变或者扩展。

    3、禁止对象之间的不良交互,提高模块化。

2、继承:给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用性,也可以在不修改类的情况下,给现存的类添加新特性。

3、多态:是编程语言给不同的数据类型做相同的接口展示的一种能力。一个多态类型的操作可以用在其他类型的值上面。

4、抽象:是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴露接口而不包含方式实现的抽象类。

 

final,finally,finalize的区别

1、final,一种修饰符,如果类的定义中增加这个修饰符那么就意味着该类不能派生出新的子类,不能作为父类被继承,给变量或者方法声明为final,意味着他们不能被修改。

2、finally,异常语句的控制执行动作,当语句出现异常的时候,就会跳入到catch语句中,然后控制执行会进入到finally代码块中。

3、finalize,方法名,清理系统资源,在垃圾收集器将对象清理之前做必要的清理工作。

 

int和Integer 有什么区别

int是基础数据类型;integer是其包装类。

为什么要提供包装类?

是为了在各种类型间转化,这里会涉及到装箱和拆箱的动作。Java中包装类比较多的用途就是用于数据类型的转化中。

 

String和StringBuilder、StringBuffer的区别

String是只读字符串,不能被继承,也就意味着String引用的字符串内容不能被修改,StringBuilder、StringBuffer的字符串对象可以直接被修改,StringBuilder在单线程下使用,因此StringBuilder的效率比StringBuffer要高 

 

&和&&的区别

&运算符有两种用法:按位与、逻辑与

&&运算符是短路与运算,它与&的区别在于,只要左侧结果为False,那么右侧就不会再执行

 

hashCode和equals的关系

对象比较.equals相同,那么hashCode一定是相同的,但hashCode相同,其equals不一定相同

 

内存中的栈(stack)、堆(heap)和静态区(static area)的用法

通常定义的一个基础数据类型的变量、一个对象的引用、已经函数调用的现场保存,都是用栈空间;

通过new关键字和构造函数创建的对象放在堆空间;

我们定义字面量,如“hello”等常量,我们是放在静态区。

比较:

  1、栈空间的读取速度是最快的,但是栈很小

  2、通常大量的对象都是放在堆空间

 

JVM加载class文件的原理机制

  是用类加载器(ClassLoader)和其子类实现的

 

重写和重载的区别

  1、重写(override)

    1、方法名、参数、返回值类型相同

    2、子类方法不能缩小父类方法的访问权限

    3、子类方法不能抛出比父类方法更多的异常

    4、存在于父类与子类之间

    5、方法如果被定义为final不能被重写

  2、重载(overload)

    1、参数类型、个数、顺序至少有一个不相同

    2、不能重载之后返回值的方法名

    3、存在于父类和子类、同类中。

 

抽象类和接口的区别

  接口是公开的,供别人访问的,里面不能有私有方法或变量。抽象类是可以与私有方法或者变量的。实现接口的,就一定要实现接口的所有方法,而抽象类可以选择的重写需要的方法。

 

反射的用途及实现

  什么是反射:

    反射就是动态获取运行时类的所有属性和方法,也可以动态获取运行时对象的所有属性和方法

  反射主要用于提供以下功能:

    1、在运行时构造一个类的对象

    2、判断一个类所具有的成员变量和方法

    3、调用一个对象的方法

    4、生态动态管理:反射最大的应用就是框架

  Java反射的主要功能:

    1、确定一个对象的类

    2、取出一个类的数据成员、方法、构造器和超类

    3、找出一个接口定义的常量和方法说明

    4、创建一个类实例,这个实例在运行时才有名字(运行时才生成对象)

    5、取得设定对象数据成员的值

    6、在运行时调用动态对象的方法

    7、创建数据,数组大小和类型在运行时才能确定,也能更改数据成员的值

  反射还有一个重要问题就是性能问题,当系统大量应用反射的时候,系统性能会大打折扣

 

自定义注解的场景及实现

  Java自定义注解是通过运行时靠反射获取注解的,通过aop给方法添加切面,通过反射获取方法包含的注解。

 

GET与POST方式的区别

  GET方法会把名值对追加在请求的URL后面。因为URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种方式传递。

  POST方法通过把请求参数值放在请求体中来克服GET方法的限制,因此,可以发送的参数的数目是没有限制的。最后,通过POST请求传递的敏感信息对外部客户端是不可见的。

 

session 与 cookie 区别 

  1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

  2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

  3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

  4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

  5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

 

JDBC 流程

  1、加载JDBC驱动:通过java.lang.Class类的静态方法:forName实现

  2、提供JDBC连接的URL:该链接的书写形式:协议:子协议:数据源标识

  3、创建数据库连接:通过java.sql.DriverManager获得Connection对象(代表一个数据库连接)

  4、创建一个Statement:要执行SQL就必须要获得java.sql.Statement实例,该实例包括3种类型:Statement(静态语句)、PreparedStatement(动态语句)、CallableStatement(数据库存储过程)

  5、执行SQL语句:Statement接口包含了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute

    1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句 ,返回一个结果集(ResultSet)对象。
    2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
    3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的 语句。 具体实现的代码:

ResultSet rs = stmt.executeQuery(“SELECT * FROM …”) ; int rows = stmt.executeUpdate(“INSERT INTO …”) ; boolean flag = stmt.execute(String sql) ;

  6、处理结果

    返回两种情况:

      1、执行更新返回的是本次操作影响到的记录数。

      2、执行查询返回的一个ResultSet结果集对象。

        ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些 行中数据的访问。
        • 使用结果集(ResultSet)对象的访问方法获取数据:
 

while(rs.next()){
            String name = rs.getString(“name”) ;
            String pass = rs.getString(1) ; // 此方法比较高效
          }
                (列是从左到右编号的,并且从列1开始)

  7、关闭JDBC对象

    关闭顺序和声 明顺序相反:

      1、关闭记录集

      2、关闭声明

      3、关闭连接对象

 

MVC设计模式

  M:模型:封装业务逻辑和数据的一个一个模块

  V:视图:所有我们看到的内容

  C:控制器:调用这些模块,当用户发起一个请求的时候,控制器会根据请求来选择要处理的业务逻辑模块和要选择的数据,再返回去把结果输出给视图来展示

 

equals 与 ==的区别

  基本数据类型(type、int、char、long、boolean、short、float、double)都是用 == 来比较他们的值。

  复合类型(类)当用 == 比较的时候,比较的是他们内存中存放的地址,所以除非是同一个new出来的对象,他们比较后的结果为true。否则比较后的结果就为false。

  equals初始行为是比较对象的内存地址,但一些类当中把这些方法重写了,如:String、 Integer 、Date