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