Java知识复习(一)基础知识

1、什么是JVM、JDK和JRE?

  1. JVM是指运行Java字节码的虚拟机。而字节码文件指的就是扩展名为.class的文件,
  2. JDK指功能齐全的Java SDK,是java开发的工具包,能够创建和编译程序,包括了JRE
  3. JRE指Java运行的环境,包括JVM、类库和命令等

2、重载和重写的主要区别

  1. 重载:在同一个类中,方法名相同,但参数类型可以不同,对返回值没有要求
  2. 重写:在运行期,子类对父类中的方法进行重新编写。其方法名、参数类型都必须相同,但返回值类型和抛出的异常范围需要小于等于父类,访问修饰符范围要大于等于父类。(两同两小一大)
  3. 注意:返回值类型小于等于父类,即若父类方法中的返回值是一个类A,那么子类重写方法中的返回值则是类A或类A的子类;若是基本数据类型,则必须相同
  4. 注意:方法名相同,返回值不同不构成重载;可以这么理解,如果只是返回值不同,系统也无法判断具体要调用哪个方法,但如果参数类型不同,则可以判断。

3、String、StringBuffer和StringBuilder的主要区别

  1. String的对象不可变,每次修改都是创建一个新的String对象,并将引用指向新的String对象。而StringBuffer和StringBuilder每次都会对其本身进行操作,而不用生成新的对象并改变对象的引用。
  2. StringBuffer的所有公开方法都是加了同步锁的,所以是线程安全,适用于多线程;而StringBuilder并没有对方法进行同步锁,所以是非线程安全的,适用于单线程。

4、自动装箱和拆箱

  1. 装箱:将基本类型用它们对应的引用类型包装起来
  2. 拆箱:将包装类型转换为基本数据类型

简单来说就像下面这样,它的装拆箱过程是自动进行的

Integer i = 10;  //装箱
int n = i;   //拆箱

5、静态方法和静态变量(static关键字)

  1. 静态方法:静态方法不需要通过类的实例就可以被调动,所以在静态方法中不能调用其他非静态变量和非静态方法。
  2. 静态变量:静态变量可以被类的所有实例所共享;在类的内部,可以直接访问类的静态变量。

6、接口和抽象类的区别

  1. 接口里只能包含抽象方法,静态方法和默认方法(加default),不能为普通方法提供方法实现,抽象类则完全可以包含普通方法,接口中的普通方法默认为抽象方法。
  2. 一个类可以扩展extend多个接口,但只能实现一个抽象类implements。
  3. 接口方法的默认修饰符是public,而抽象方法可以有public、protected和default这些修饰符,但不能用private,因为抽象方法就是为了被重写的
  4. 接口中只能有public static final变量,而抽象类中没有规定。
  5. 总的来说,抽象是一种模板设计,必须要重写某些方法;而接口是一种行为规范,每个方法不是必须要重写的。

7、==和equals()

  1. == :作用是判断两个对象的地址是否相等(基本数据类型= =比较的是值,引用数据类型= =比较的是内存地址)
  2. equals() :判断两个对象是否相等,如果类没有覆盖equals()方法,则等价于通过==比较这两个对象,但通常类会覆盖equals方法,进而比较的是两个对象的内容是否相等。(例如 String)

8、异常处理

  • 所有的异常都有一个共同的祖先:Throwable类。Throwable类有两个重要的子类Exception(异常)和Error(错误)。
  • Exception能被程序本身处理(try-catch),Error是无法处理的(只能尽量避免)
  • Exception可以分为受检查异常(编译时就报错,必须显式处理,即try-catch)和不受检查异常(即运行时异常,不处理也可以通过编译,但运行到此时会报错)
  • 运行时异常包括:NumberFormatException(字符串转换为数字的格式错误)、ArrayIndexOutOfBoundsException(数组越界)、ClassCastException(类型转换错误)等
  • 非运行时异常包括:SQLException(sql语句错误)、FileNotFoundException(文件不存在)、ClassNotFoundException(反射时指定类不存在)

9、浅拷贝和深拷贝

  1. 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝
  2. 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容

10、序列化和反序列化

  1. 序列化:将数据结构或对象转换成二进制字节流的过程
  2. 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或对象的过程

常见应用场景:网络传输(计网向下打包的过程,对应TCP/IP协议的应用层)、存储到文件、存储到数据库、存储到内存(PS:上述反向过程就是反序列化的过程)
注意: 序列化保存的是对象的状态,静态变量属于类的状态,因此,序列化并不保存静态变量

11、transient关键字

应用场景: 如果某些变量不想被序列化,则使用transient关键字修饰,修饰后,但对象被反序列化时,该变量值不会被持久化和恢复,会被置成默认值(例如:int变量就会变成0)

12、对象之间最好不要直接用“=”赋值

  • 两对象之间使用“=”是将引用所指地址进行赋值,而不是内存块的内容
  • 也就是说此时当对象1被修改时,对象2也会被修改
List list1 = new ArrayList();
List list2 = new ArrayList();
String url1 = "1";
String url2 = "2";
list1.add(url1);
list1.add(url2);
list2 = list1;  //通过“=”运算符,此时list2与list1指向同一块内存地址,list2原先分配的内存地址被回收
list1.clear();	//清除list1中的内容
Log.d("list1Size", "" + list1.size());//size = 0
Log.d("list2Size", "" + list2.size());//size = 0
  • 对于集合来说,可以通过addAll或构造方法赋值
list2.addAll(list1);

list2 = new ArrayList(list1);

13、成员变量和局部变量的区别

  • 成员变量是独立于方法外的变量,局部变量是类的方法中的变量
  • 成员变量:包括实例变量和类变量,用static修饰的是类变量,不用static修饰的是实例变量,所有类的成员变量可以通过this来引用
  • 局部变量:包括形参,方法局部变量,代码块局部变量,存在于方法的参数列表和方法定义中以及代码块中
  • 成员变量存储在堆,局部变量存储在栈。局部变量的作用域仅限于定义它的方法,在该方法的外部无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它。如果访问权限允许,还可以在类的外部使用成员变量
  • 成员变量在累加载或实例被创建时,系统自动分配内存空间,并在分配空间后自动为成员变量指定初始化值,初始化值为默认值,基本类型的默认值为0,复合类型的默认值为null。(被final修饰且没有static的必须显式赋值),局部变量在定义后必须经过显式初始化后才能使用,系统不会为局部变量执行初始化

14、面向对象的三大特性

  • 封装:封装就是把客观事物抽象成类,并且把自己的属性和方法让可信的类或对象操作,对不可性的隐藏
  • 继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
  • 多态:父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作

15、访问修饰符

  • public可以被当前类,子类,包,其他包,访问,
  • protected 可以被当前类,子类,包内类访问
  • default可以被当前类,包内类访问;
  • private只能被当前类访问

16、类的加载顺序

  • (1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
  • (2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )
  • (3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )
  • (4) 父类构造函数
  • (5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )
  • (6) 子类构造函数

17、Object类的常用方法

  • equals():用于确认两个对象是否相同,不过一般子类中都会重写equals方法
  • hashCode():用于获取对象的哈希值,这个值的作用是检索
  • toString():返回一个String对象,用来标识自己,一般子类都会覆盖
  • getClass():获取类的class对象,通常用于反射
  • wait()和notify():等待和唤醒,通常用于多线程中

18、JDK中常用的包有哪些

  • java.lang:这个是系统的基础类;
  • java.io:这里面是所有输入输出有关的类,比如文件操作等;
  • java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
  • java.net:这里面是与网络有关的类;
  • java.util:这个是系统辅助类,特别是集合类;
  • java.sql:这个是数据库操作的类。

19、什么是反射机制

  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

20、反射机制的应用场景有哪些?

  • 反射是框架设计的灵魂,举下面几个例子
  • 我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;
  • Spring框架也用到很多反射机制,最经典的就是xml的配置模式;Spring 通过 XML 配置模式装载 Bean 的过程:1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; 2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 3)使用反射机制,根据这个字符串获得某个类的Class实例; 4)动态配置实例的属性

21、jdk8新增了哪些特性

  • Lambda表达式
  • 方法引用,与Lambda表达式联合使用
  • 新增接口:默认方法与静态方法
  • 新增base64加解密API
  • JVM的permGen空间移除,被Metaspace元空间取代
  • Java Date/time API
  • Stream函数式操作流元素集合
  • 等等

22、算术右移和逻辑右移有什么区别

  • 算术右移是>>,逻辑右移是>>>
  • 算术右移需要考虑符号位(0正1负),右移一位,若符号位为1,就在左边补1,;否则,就补0;逻辑右移就是不考虑符号位,右移一位,左边补零即可。
  • 所以算术右移也就相当于有符号位的除法,右移n位就等于除2的n次方。
  • 算术左移和逻辑左移一样都是右边补0

23、final、finally和finalize的区别是什么

  • final:可用来定义变量、方法传入的参数、类、方法。
  • finally:只能跟在try/catch语句中,并且附带一个语句块,表示最后执行。
  • finalize:是垃圾回收器操作的运行机制中的一部分,进行垃圾回收器操作时会调用finalize方法,因为finalize方法是object的方法,所以每个类都有这个方法并且可以重写这个方法,在这个方法里实现释放系统资源及其他清理工作,JVM不保证此方法总被调用。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值