编程语言
首页 > 编程语言> > java面试题(日积月累)

java面试题(日积月累)

作者:互联网

面试题

java基础

java语言特点

面向对象(贴近人类思维模式,模拟现实世界,解决现实问题)

简单性(自动内存管理机制,不易造成内存溢出,简化流程处理,语义清晰)

跨平台(操作系统,服务器,数据库)

java的执行机制

先编译,在解释
将源文件编译成字节码文件(平台中立文件.class),再将字节码文件进行解释执行

命名规范

包名小写,类名大驼峰,方法名小驼峰

什么是面向对象,面向对象理解

面向对象就是分工与协作,面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者,以及各自需要做什么

例如:洗衣机洗衣服
面向过程将会将任务拆解成一系列的步骤
1.打开洗衣机—》2.放衣服—》3.放洗衣粉—》4.清洗—》5.烘干

面向对象会拆成人和洗衣机两个对象:
人:打开洗衣机,放衣服,放洗衣粉
洗衣机:清洗,烘干

面向过程比较直接高效,面向对象易于复用维护和扩展

面向对象

封装

封装的意义,在于明确表示出允许外部使用的所有成员函数和数据项,内部细节对外部调用透明,外部调用无需修改或者关心内部实现
1.javabean的属性私有,提供getset对外访问,因为属性的赋值或者获取逻辑只能由javabean本身决定,而不能由外部胡乱修改

private string name;
public void setName(String name){
  this.name="物联网"+name;
}
//该name有自己的命名规则,明显不能由外部直接赋值

2.orm框架
操作数据库,我们不需要关心链接是如何建立的,sql是如何执行的,只需要引入mybatis,调用方法即可

继承

继承基类的方法,并做出自己的改变和扩展
子类共性的方法或者属性直接使用父类的,而不需要自己再定义,只需扩展自己个性化的,把共性的抽到父类,达到代码复用

继承特点

继承鼓励类的重用
继承可以多层继承
一个类只能继承一个父类,java只支持单继承
父类中private,default修饰的不能被继承
构造方法不能被继承,只能调用

继承带来的好处与弊端

继承的好处:
继承可以让类与类之间产生关系,子父类关系,产生子父类后,子类则可以使用父类中非私有的成员。

提高了代码的复用性(多个类相同的成员可以放到同一个类中) 提高了代码的维护性(如果方法的代码需要修改,修改一
处即可)

继承弊端:
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削 弱了子类的独
立性

继承的应用场景: 使用继承,需要考虑类与类之间是否存在is..a的关系,不能盲目使用继承 is..a的关系:谁是谁
的一种,例如:老师和学生是人的一种,那人就是父类,学生和老师就是子类

继承中变量的访问特点

在子类方法中访问一个变量,采用的是就近原则。
1. 子类局部范围找 
2.  子类成员范围找 
3.  父类成员范围找 
4.  如果都没有就报错(不考虑父亲的父亲…)

继承中构造方法的访问特点

注意:子类中所有的构造方法默认都会访问父类中无参的构造方法
 
子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化, 
原因在于,每一个子类构造方法的第一条语句默认都是:super()
 
问题:如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

1. 通过使用super关键字去显示的调用父类的带参构造方法 

2. 在父类中自己提供一个无参构造方法

继承中成员方法的访问特点

1.通过子类对象访问一个方法
3. 子类成员范围找 
4. 父类成员范围找 
5. 如果都没有就报错(不考虑父亲的父亲…)

继承的注意事项

 Java中类只支持单继承,不支持多继承(接口支持多继承)
 
 错误范例:class A extends B, C { }
 Java中类支持多层继承

多态

基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同
多态的三个条件:继承,方法重写,父类引用指向子类对象

父类类型 变量名=new 子类对象;
变量名.方法名();

缺点:无法调用子类特有的功能

多态中的成员访问特点

成员访问特点:

成员变量
  编译看父类,运行看父类
  或者编译看左边,运行也看左边
  
成员方法
  编译看父类,运行看子类
  或者编译看左边,运行看右边(因为方法有重写)

多态的好处和弊端

好处
  提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
  
弊端
  不能使用子类的特有成员 

1. JDK 和 JRE 有什么区别?

JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
包含了jre+类库+开发工具包(编译器+调试工具)

JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
包含jvm和解释器,完整的java运行环境

JVM虚拟机
使用软件在不同的操作系统中,模拟相同的环境

具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK

在这里插入图片描述

== 和 equals 的区别是什么?

基本类型:比较的是值是否相同;
引用类型:比较的是引用(内存地址)是否相同;

而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String等把它变成了值比较

final 在 java 中有什么作用

1.修饰变量时,定义时必须赋值,被修饰的变量不可变,一旦赋了储值就不能重新赋值

2.修饰方法 该方法不能被子类重写但是可以被重载

3.修饰类,该类不能被继承,比如math,string类

fianl关键字的作用 final代表最终的意思,可以修饰成员方法,
成员变量,类 final修饰类、方法、变量的效果 fianl
修饰类:该类不能被继承(不能有子类,但是可以有父类) 
final修饰方法:该方法不能被重写
final修饰变量:表明该变量是一个常量,不能再次赋值 

static的访问特点

非静态的成员方法
能访问静态的成员变量 
能访问非静态的成员变量 
能访问静态的成员方法 
能访问非静态的成员方法
静态的成员方法
能访问静态的成员变量 
能访问静态的成员方法

静态成员方法只能访问静态成员

静态变量的特点与区别

静态变量全局唯一,为所有的对象共用,修改它的值,其他对象使用该变量时,值也会改变

非静态变量,每个对象持有一份,是独立的,修改对象的值不会影响其他对象的该值。

java 中操作字符串都有哪些类?它们之间有什么区别?

String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐 使用 StringBuffer

集合框架

ArrayList 和 Vector,LinkedList 的区别

这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集
合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我
们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的,这是
HashSet 之类的集合的最大不同处,HashSet 之类的集合不可以按索引号去检索其
中的元素,也不允许有重复的元素

Vector 是线程安全的,也就是说是它的方法之间是线程同步的,而 ArrayList 是线
程序不安全的,它的方法之间是线程不同步的

ArrayList 与 Vector 都有一个初始的容量大小,当存储进它们里面的元素的个数超
过了容量时,就需要增加 ArrayList 与 Vector 的存储空间,每次要增加存储空间
时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数
在内存空间利用与程序效率之间要取得一定的平衡。Vector 默认增长为原来两倍,

ArrayList 与 Vector 都可以设置初始的空间大小,Vector 还可以设置增长的
空间大小,而 ArrayList 没有提供设置增长空间的方法

总结:即 Vector 增长原来的一倍,ArrayList 增加原来的 0.5 倍。

rrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数
据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组
元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了
synchronized 方法(线程安全)。
通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数
据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插
入速度较快 。
ArrayList 在查找时速度快,LinkedList 在插入与删除时更具优势

数据库

mysql

char和varchar的区别

区别一,定长和变长
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;
varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。

因为其长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储与查找;但是char也为此付出的是空
间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换
空间。

区别之二,存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大
长度是 65,532字节。

javaweb

转发和重定向

转发是服务器行为
转发浏览器只做了一次访问请求
转发浏览器的地址栏不发生变化
转发两次跳转之间的传输信息不会丢失,所以可以通过request进行数据的传递
转发只能将请求转发给同一个Web应用的组件

重定向是客户端行为
重定向是浏览器至少做了两次的访问请求
重定向浏览器地址改变
重定向两次跳转之间传输的信息会丢失(不能使用request范围)
重定向可以指向任何的资源,包括当前应用程序中的其他资源,同一个站点上的其他应用程序中的资源,其他站点资源

Servlet什么时候被创建?

1.默认情况下,第一次被访问时,Servlet被创建


2.可以配置执行Servlet的创建时机。
在<servlet>标签下配置
(1)第一次被访问时,创建
   <load-on-startup>的值为负数或不写
(2)在服务器启动时,创建
  <load-on-startup>的值为正整数

springboot

描述一下SpringBoot的作用

Spring Boot有哪些优点

1. 减少开发时间,通过提供默认值快速开发
2. 使用javaConfig有利于避免使用XML,无代码生成,开箱即用
3. 避免大量的Maven导入和各种版本冲突
4. 不需要单独的服务器,SpringBOOT工程在部署时,采用的是jar包的方式,内部自动依赖Tomcat容器,提供了多环境配置
5. SpringBOOT中默认整合第三方框架时,只需要导入响应的starter依赖包,就会自动整合了

标签:面试题,java,继承,子类,成员,访问,日积月累,父类
来源: https://blog.csdn.net/qq_44866153/article/details/115101533