java面试进阶-基础篇:基本功

1、面向对象的特征
  面向对象是软件开发方法,是对自然界理解和抽象的一种方法,是编程技术发展一定程度的必然阶段。

  • 对象唯一性。每个对象拥有唯一标识,通过这个标识,可以找到它。在对象的整个生命周期中,标识不会改变,不同的对象不能拥有相同的标识。
  • 抽象性。抽象性是指将一致的数据结构和行为抽象成类。类反映了与应用相关的重要性质。
  • 继承性。继承性是子类自动继承父类数据结构和方法的一种机制,是类之间的一种关系。

2、final, finally, finalize 的区别

  • final可以修饰类、变量(成员变量和局部变量)和方法。修饰类时,改类不能被继承,不能使用final和abstract或interface同时修饰类;修饰方法时,该方法不能被子类重写,方法如果被private修饰,只能被父类使用,子类重写相当于自己定义了一个方法;修饰成员变量必须要赋值,修饰非静态成员变量可以在声明时赋值,在初始化块中赋值和在结构体中赋值,修饰静态成员变量可以在声明时赋值,在静态初始化块中赋值,不能在结构体中赋值;修饰局部变量时,可以放在形参和方法体中国,变量只能被读取,不能被修改;修饰引用类型变量,变量不能再指向其它的引用,但可以修改引用对象的属性。
  • finally配合try和catch一起使用,是在try和catch执行完成之后开始执行的。finally执行的前提是代码进入到了try,并且try和catch内没有System.exit()。如果return返回基本数据类型,在finally内对其进行修改不会改变值,如果返回引用类型如类、list则会改变返回结果。如果finally内有return,则返回return的结果,如果没有则回到try或catch执行return返回结果。finally在try和catch的return之前执行。如果try、catch和finally内均没有return,对所有变量类型保持一致。
  • finalize是java.lang.Object的一个方法,是GC运行机制的一部分,在GC清理它的所属对象时被调用,如果遇到无法捕捉的异常则终止调用,并且改异常也会被忽略,直到下一次GC清理改对象时,finalize方法再次被调用。程序调用java.long.System的gc方法,在清理ft对象时调用finalize。System.gc()等同于Runtime.getRuntime.gc(),调用改方法只是建议虚拟机清理改对象,释放闲置的内存空间。

3、int 和 Integer 有什么区别

  • Integer时int的包装类,int是基本数据类型
  • Integer必须实例化后才能使用,int不需要
  • Integer实例化时生成一个指向对象的指针,int直接指向数据值
  • Integer默认值是null,int是0

4、重载和重写的区别

  • 定义不同。重载是指使用相同的函数名,但函数参数个数、顺序或类型不同,调用的时候根据参数区分不同的函数;重写是派生类对基类中的方法的重新实现,函数名和参数一致,只是函数的实现体不一样。
  • 规则不同。重载必须有不同的参数列表,可以由不同的访问修饰符修饰,可以抛出不同的异常;重写方法参数列表和返回类型必须与被重写的方法保持一致。重写方法不能抛出新的检查异常或比被重写方法更加宽泛的检查异常。

5、抽象类和接口有什么区别

  • 抽象类被子类继承,接口被类实现
  • 接口只做方法声明,抽象类既可以做方法声明,又可以做方法实现
  • 接口里定义的变量只能公共的静态的变量,抽象类里定义的是普通的变量
  • 接口是设计的结果,抽象类是重构的结果
  • 抽象类和接口都用来抽象具体对象,但接口的抽象级别更高
  • 抽象类可以有具体的方法和属性,接口只能有抽象的方法和不可变常量
  • 抽象类主要用来抽象类别,接口主要用来抽象功能
  • 抽象类子类使用extents继承抽象类,子类如果不是抽象类的话,必须提供抽象类所有方法的实现
  • 接口使用implements实现接口,它需要提供接口中所以方法的实现
  • 抽象方法可以用protect、public或default修饰,接口默认且只能用public修饰
  • 抽象类与普通java类相比,可以执行main方法,但不能被实例化。接口没有main方法
  • 抽象类子类只能继承一个抽象类,接口子类可以继承多个接口。

6、说说反射的用途及实现
  程序运行时,允许修改程序结构或变量类型,这种语言成为动态语言。java并不是动态语言,但提供了一个动态机制,即“反射”。它允许程序运行过程中,获取自身的信息,并操作类和对象的属性。

  • 反射的核心:JVM运行时加载的类或方法或属性,它不需要预先知道运行对象是谁。
  • 反射的主要用途:当我们在使用 IDE(如Eclipse\IDEA)时,当我们输入一个变量或者类并向调用它的属性和方法时,一按 (“.”)点号,编译器就会自动列出她的属性或方法,这里就会用到反射。
    反射最重要的用途就是开发各种通用框架。
    很多框架(比如 Spring)都是配置化的(比如通过 XML文件配置JavaBean,Action之类的),为了保证框架的通用性,他们可能根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。
  • 实现方法:对象.getClass();类名.class;Class.forName(“全类名”)

7、说说自定义注解的场景及实现

  • 使用场景:类属性自动赋值,例如对上下文、传入参数等赋值;
    验证对象属性完整性,例如,对参数的校验;
    代替配置文件功能,像spring基于注解的配置;
    可以生成文档,例如java 最早提供的注解。常用的有@param @return 等;
    利用注解针对性做一些前置或者后置的处理,例如记录日志、检验权限等
  • 自定义注解会需要元注解,此处先介绍元注解。
    元注解包含四种:@Retention、@Inherited、@Documented、@Target
    @Documented –注解是否将包含在JavaDoc中
    @Retention –什么时候使用该注解
    @Target –注解用于什么地方
    @Inherited – 是否允许子类继承该注解
  • 自定义注解的定义:
    Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口;
    参数成员只能用public或默认(default)这两个访问权修饰 ;
    参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法;
    注解也可以没有定义成员, 不过这样注解就没啥用了;
    自定义注解需要使用到元注解

8、HTTP 请求的 GET 与 POST 方式的区别

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求在URL中传送的参数是有长度限制的,而POST么有。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中。
  • GET和POST本质上并无差别,都是HTTP链接,只不过由于HTTP的规定和浏览器/服务器的显示,使得它们在应用过表现得有所不同。
  • GET产生一个数据包,POST产生两个数据包。GET请求header和data一并发送,POST请求先发送header再发送data。

9、session 与 cookie 区别

  • 存取方式不同。cookie只能存取ASCII字符,存取Unicode或二进制数据需要进行编码,不能直接存取java对象。session能够存取任意类型的数据,如String、Integer、List、Map。session能够直接保存java bean或任意java类、对象等,相当于java容器。
  • 隐私策略不同。cookie存储再客户端阅读器,对用户是可见的,客户端的程序可能会窥探、复制或修正cookie的内容。session存储在服务器上,对客户是透明的,不存在重要信息泄露的风险。
  • 有效期不同。cookie只需要设置有效期为一个很大的数字,便能达到长久有效。session默认有效期为-1,关闭浏览器session就会失效,cookie有效期不宜设置过大,否则会生成过多的session增加服务器的压力。
  • 服务器压力不同。cookie保存在客户端,不占用服务器资源。session保存再服务器端,每个用户产生一个session,并发量过大时不宜采用session。
  • 浏览器支持不同。cookie需要客户端浏览器支持,假如关闭支持,则会话跟踪失效。运用session程序的URL都需要地址重写,否则会话跟踪失效。
  • 跨域支持不同。cookie支持跨域名访问,session仅在它所在的域名内有效。

10、session 分布式处理

  • Session复制。支持session复制的web服务器上,通过修改服务器配置同步到其他web服务器,使各web服务器session保持一致。
  • Session粘贴。用户的每次请求分发到某一web服务器,只要者一web服务器存储了session数据,便能实现会话跟踪。
  • Session集中管理。使用缓存技术,如使用redis存储session数据,集中管理所有的session,所有web服务器都能从redis存储介质中找到对应的session,实现session共享。
  • 基于Cookie管理。用户每次发送请求,将session保存到cookie中发送到服务器。

11、JDBC 流程

  • 加载Driver类,注册数据库驱动。
  • 通过DriverManager,使用Url,用户名和密码创建Connection连接。
  • 通过Connection,使用sql语句打开statement。
  • 执行语句,将结果返回resultSet。
  • 对resultSet进行处理。
  • 按倒序依次释放资源,resultSet->ReparedStatement->Connection。

12、MVC 设计思想
MVC是软件工程中的一种软件架构方式,将软件系统分为Model、View和Controller三个部分。

  • Controller控制层负责转发请求,对请求进行处理。理解为接受用户请求,将视图层和模型匹配到一起,共同完成用户的请求。
  • Model视图层,用户交互界面,即HTML界面,界面设计人员进行图形界面设计。它接收视图层发送的请求,并返回相应的处理结果。
  • Model模型,业务流程状态的处理,业务规则的制定。

13、equals 与 == 的区别

  • ==针对基本数据类型,比较它们的值,针对引用数据类型,比较的是他们的存储地址。
  • equals用于引用类型数据进行比较,比较它们存储地址中存放的值。
  • 简单来说,==用于比较栈地址,equals用于比较栈地址指向的堆里存放的内容。
  • 所有的java对象都基于Object,Object的equals方法等同于==。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值