java基础面试总结
一、JDK,JRE和JDK的区别
JVM: java的虚拟机,java程序运行的平台,不同的平台有自己的虚拟机,因此java语言是跨平台编译语言。
JRE: 包括java的虚拟机和java程序运行所需的核心类库。主要是java.lang包
JDK: 提供给开发人员使用的,其中包括java的开发工具和JRE。其中编译工具为javac.exe 打包工具为jar.exe
1. JDK常用的包有哪些
java.lang : 系统的基础类
java.io: 与输入输出有关的类,比如文件操作
java.nio: 提高io包中性能而写的一个新的包。
java.net: 与网络有关的类
java.util:系统辅助类,特别是集合类
java.sql: 数据库操作的类
二、 基础语法
1. 数据类型
基础数据类型:
整形:字节型(byte)、短整型(short)、整型(int)、长整型(long)
浮点型:单精度浮点型(float)、双精度浮点型(double)
字符型:字符型(char)
布尔型:布尔型(boolean)
引用数据类型:类、接口、数组
2. java的修饰符
private: 在同一类可见。使用对象:变量,方法。他不能修饰类(外部类)
public: 对所有类可见,使用对象:类,接口,变量,方法
protected: 对同一包内的类和所有子类可见 使用对象:变量,方法。 注意:不能修饰类(外部类)
default: 缺省,在同一包内可见 使用对象:类,接口,变量,方法。
3. final,finally,finalize区别
final: 修饰:类,方法,变量
修饰类表示这是一个超类,不能被继承,不能被重写。
修饰变量:常量,不能被重新赋值。
finally:一搬用于try_catch代码块中,被Fianlly修饰的代码块不管出现异常与否,都会被执行
finalize: 是一个方法,属于Object类的一个方法,改方法一般有垃圾回收器来调用。
4. this,super的用法
this用法: 普通直接引用,相当于指向当前类本身。
形参与实参重名,用this来区分
用来引用本类的构造函数。
super用法:普通直接引用,相当于指向当前对象父类的引用。
子类和父类方法重名时用super来区分。
引用父类的构造函数,放在第一句。
尽管可以用this一个构造器,但却不可以调用两个:
调用this构造器必然会调用其他的构造函数,其他的构造函数也存在super语句,这样调用就失去的意义。
从本质上讲:this是指向对象的指针,super只是一个关键字。
5. static
主要意义:在于用来创建独立于具体对象域变量或者方法,以至于没有创建对象也可以调用属性和方法。
用来形成静态代码块以优化程序性能(只加载一次)
被static加载的对象不属于任何一个实例对象,而是被类的实例对象所共享,他优先于对象的存在。
二、面向对象
1. 面向对象与面向过程的区别
面向对象:面向对象是模型化的,只需要抽象出一个类。
优点:容易维护,复用,拓展。由于面向对象具有继承,封装,多态可以设计低偶和的系统。
缺点:性能低一点
面向过程: 面向过程是具体化流程化的,解决问题需要一步一步来。
2. 面向对象的三大特性
封装:把一个对象私有化,同时还提供一些可以被外界访问的属性方法。
继承:把已经存在得类作为基础,建立新的类,也可以用父类的功能。
子类拥有父类除 private 的属性和方法
多态:顾名思义就是拥有“多种形态”的含义,是指属性或方法在子类中表现为多种形态。
多态的实现方法:封装,继承,向上转型(三个必要条件)。
实现多态有两种方法:继承和接口
方法重载:实现的是编译时多态(前绑定)
方法重写:实现的是运行时多态性(后绑定)
3. 重写和重载的区别
重载:发生在本类,参数列表不同,与返回值无关,之和方法名,参数列表,参数类型有关。
简单而言:重载就是对于不同的情况写不同的方法。
主要特征:
1、方法名必须相同
2、方法的参数列表一定不一样
3、访问修饰符和返回值类型可以相同也可以不同。
重写:发生在子类和父类之间,简单而言就是具体的实现类对父类的实现方法不满意,需要自己写一个满足于自己需求的方法。
主要特征:
1、方法名必须相同,返回值类型必须相同。
2、参数列表必须相同。
3、访问权限不能比父类中被重写的方法更低。
4、子类和父类在同一包中,可以重写除了private和final之外的所有方法
5、构造方法不能重写
三、类和接口
1. 接口和抽象类的区别
抽象类:用来捕捉子类的通用特性,是对于类的抽象,是一种模板设计。
可以有构造器,访问修饰符任意,声明字段任意。
**注意:**抽象类不能用final修饰,抽象类的目的是让其他类去继承的。
接口:抽象方法的集合,是行为的抽象,是一种行为规范。
不能有构造器,访问修饰符默认为public,不能为private和protected,声明字段默认为final和static
相同点:
1、接口和抽象类都不能被实例化
2、都位于继承的顶端,用于被其他实现和继承
3、都包含抽象方法,子类都必须覆写这些方法
注意:java8之后引入了默认构造方法和静态方法,现在,接口提供默认的实现方法,不强制子类实现它。
四、变量和方法
1. 成员变量和局部变量的区别
变量:在程序执行中,在某个范围内其值可以发生改变的量,从本质上来讲,变量其实是内存中的一小块区域。
成员变量:方法外部,类内部定义的变量
局部变量:类的方法中的变量。
区别:
作用域: 成员变量:整个类有效;局部变量:只在某个范围内有效
存储位置:成员变量:与对象同生工死,在堆内存中; 局部变量:方法调用时而存在,存储在栈 内存中,方法调用完后,自动释放。
初始值:成员变量:有默认的初始值;局部变量:没有默认的初始值,使用前必须赋值。
2. 构造方法有哪些特性
名字与类名相同;没有返回值,但是不能void申明构造函数;生成类的对象是,自动执行,无需调用
3. 静态变量和实例变量的区别
静态变量:不属于任何实例的对象,属于类的,在内存中只有一份,类加载的过程中,JVM只为静态变量分配一次内存。
实例变量:类每次加载都会创建一份。
4. 静态变量和普通变量的区别
静态变量:被所有对象所共享,内存中只存在一个副本,他当且仅当在类的初次加载时会被初始化。
普通变量:在创建对象时被初始化,存在多个副本,互不影响。
静态变量的初始化顺序按照定义的顺序进行初始化。
五、内部类
1. 定义
一个类的定义放在另外一个类的定义内部。内部类的本身就是类的一个属性,与其他属性定义方法一致。
2. 内部类的分类
内部类可分为四种:成员内部类,局部内部类,匿名内部类和静态内部类。
3. 静态内部类
定义在类内部的静态类。
静态内部类可以访问外部类中所用的静态变量,而不可以访问外部类的非静态变量
定义方式: new 外部类.静态内部类()
4. 匿名内部类
就是没有名字的内部类,日常开发中使用较多。
public class Quter {
private void test(final int i){
new Service(){
public void method() {
for(int j = 0;j<i;j++){
System.out.println("匿名内部类");
}
}
}.method();
}
interface Service{
void method();
}
}
创建方法:
new Service(){
public void method() {
for(int j = 0;j<i;j++){
System.out.println("匿名内部类");
}
}
}.method();
匿名内部类除了没有名字,还应有如下特点:
1、必须继承一个抽象类或实现一个接口。
2、匿名内部类不能定义静态变量和方法。
3、当所有的方法的形参需要被匿名内部类使用时,必须申明为final
4、匿名内部类不能是抽象的,它必须实现继承的类或者实现接口中的所有方法。
5. 内部类的优点
1、一个内部类对象可以访问创建它的外部类所有数据,包括私有数据
2、内部类部位同一包的其他类可见,具有很好的封装性。
3、内部类有效的实现了“多重继承”,优化了java单继承的缺陷。
4、匿名内部类可以很方便的定义回调。
六、对象相等判断
1. == 和equals的区别是什么
== :判断两个对象的地址是不是相同,基本数据类型:比值,引用数据类型:比较内存地址。
equals: 判断两个对象是否相等;
1、类中没有覆盖equals时,通过equals比较两个对象,相当于==,比较两个对象。
2、类中覆盖了equals方法。一般我们覆盖equals方法比较两个对象内容相等。
String 方法的equals是被重写过的,Object的equals方法比较对对象的地址,而String的equals比较的是两个对象的值。
当创建String类型的对象是,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有,就把他赋给当前引用,如果没有就在常量池中创建一个。
七、BIO、NIO、AIO的区别
BIO:同步阻塞I/O模式,数据的读取必须在一个线程内等待完成。在活动链接小于1000的情况下,比较适合
不用考虑过载,和限流等问题,线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接和请求。
NIO:同步非阻塞的I/O模型,提供了Selector,Channel,Buffer等抽象。NIO的N,不是单纯的New,可以支持面向缓冲,基于通道的I/O操作方法。对于高负载和高并发的(网路)应用,应用NIO来开发。
AIO: 异步非阻塞,异步IO是基于事件和回调机制实现的,也就是操作之后会直接返回不会阻塞在那里,当后台处理完成后,操作系统会通知相应的线程进行后续处理。
八、反射
1. 反射的概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmUBTDEr-1614652030661)(D:\我的桌面\我的笔记\面试宝典资料截图\反射.png)]
va类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
[外链图片转存中…(img-XmUBTDEr
-1614652030661)]