Java基础知识

Java面试常见基础知识

Posted by slHu on June 22, 2021

Java面试常见基础知识总结


1. Java语言的优点

  • Java为纯面向对象的语言。
  • 平台无关性。
  • 具有良好的扩展性和健壮性。
  • 提供了很多内置的类库,简化了开发。
Java与C++的区别
  • Java为解释性语言,C++为编译型语言
  • Java为纯面向对象语言,C++兼具面向对象和面向过程的特点
  • Java没有指针的概念,更安全
  • Java不需要程序显式的管理内存的分配
  • Java不支持多继承

2. Java的main方法解析

main方法是程序的入口方法,需要被public和static修饰。public是权限修饰符,表名任何类或对象都可以访问这个方法;static表明这是一个静态方法,方法被存储在静态存储区,只要类被加载就可以使用该方法而不需要通过实例化来对象来访问。

3. Java程序的初始化顺序

  • 父类静态变量—>父类静态代码块—>子类静态变量—>子类静态代码块—>父类非静态变量—>父类非静态代码块—>父类构造函数—>子类非静态变量—>子类非静态代码块—>子类构造函数。

4. Java中的作用域有那些

在Java语言中,作用域是由花括号的位置决定的,它决定了其定义的变量名的可见性与声明周期。

在Java语言中,变量类型主要有三种:成员变量、静态变量 、局部变量。类的成员变量的作用范围与类的实例化对象的作用范围相同,当类被实例化时,成员变量就会在内存中分配空间并初始化,直到这个被实例化对象的生命周期结束,成员变量的生命周期才结束。被static修饰的成员变量,被称为静态变量(全局变量),只要类被加载,JVM就会给类的静态变量分配存储空间。局部变量的作用域与可见性为它所在的花括号内。

访问权限修饰符 当前类 同一包 子类 其他包
public 可见 可见 可见 可见
protected 可见 可见 可见 不可见
default 可见 可见 不可见 不可见
private 可见 不可见 不可见 不可见
什么是构造函数

构造函数是一种特殊的函数,主要的用在对象实例化时初始化对象的成员变量。

5. Java中的clone方法有什么作用

Java中基本类型作为传递参数时,是传递的值的拷贝,无论怎么改变这个拷贝,原值不会改变。

引用类型作为传递参数时,是把对象在内存中的地址拷贝了一份给参数。

  • 浅拷贝:拷贝后得到的对象中的引用数据类型拷贝的是原对象中的引用数据类型的地址;
  • 深拷贝:拷贝后得到的对象中的引用数据类型是对原对象中的引用数据类型复制了一下,和原来引用对象的地址不相同。

6. 什么是反射机制

Java的反射机制是指:对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任一个方法和属性,这种动态获取信息以及动态调用对象的方法的功能被称为Java语言的反射机制。

如何获得class?
  • class.forName(“类的路径”);
  • 类名.class
  • 实例对象.getClass()

7. package有什么作用

  • 提供多层命名空间,解决命名冲突
  • 对类按功能进行分类,使项目的组织更加清晰

8. 面向对象的理解

  • 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

  • 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为

9. 关于封装、继承、多态

  • 封装:封装是实现面向对象程序设计的第一步,封装就是将数据或函数等放在一个模块中(类中);可以对数据封装,保护数据成员,不让类以外的程序直接访问和修改,只能通过提供的公共的接口来访问和修改;也可以对方法封装,方法的细节对用户是隐藏的。
  • 继承:一个新事物(子类)保留(可以使用)一个老事物(父类)的一些属性和方法,并具有一些自己特有属性和方法,可以实现代码复用,提高开发效率。(子类可以继承父类非私有的成员变量和方法)。
  • 多态:多态的前提:继承的存在;子类重写父类的方法;父类的引用指向子类的对象。

    • 多态:在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编程的时候并不确定,当处于运行期间才确定。就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。

10. 重载和重写

  • 重载:指的是在一个类内部可以存在多个方法名相同的函数;但是函数的参数列表应该不同。(编译时多态)
  • 重写:指的是子类继承了父类,子类对父类中的那个方法进行了修改,实现了自己特有的功能。(运行时多态)

11. 抽象类和接口的异同

  • 抽象类:包含了抽象方法的类。
  • 接口:就是一个方法的集合,所有方法都没有方法体。
  • 不同点:
    • 接口只有定义,不能实现;抽象类可以有定义和实现;
    • 一个类可以实现多个接口,但是只能继承一个抽象类;
    • 接口强调特定功能的实现,has - a 关系;抽象类强调所属关系,is - a关系;
    • 接口中定义的成员变量默认为public static final,只能够有静态的不能被修改的数据成员,必须赋初值;抽象类中的成员变量默认为default;接口中的方法都是public abstract;抽象类可以任意;
    • 当功能需要积累时,用抽象类;否则用接口

12. final、finally和finalize有什么区别

  • final是一个关键字,用于修饰类,属性,方法;修饰类表示类不可被继承;修饰属性,表示属性不可变;修饰方法,表达方法不可被重写;
  • finally用于异常处理,表示里面的内容一定会被执行;经常用于释放资源;
  • finalize是Object类的一个方法;在垃圾回收器执行时会调用回收对象的finalize()方法,先调用,下次垃圾回收动作才会真正回收。

13. volatile的作用

在Java语言编写的程序中,有时为了提高程序的运行效率,编译器会自动对其进行优化,把经常访问的变量缓存起来,程序在读取这个变量时可以直接从缓存中读取,这样提高了程序的运行效率。但是在多线程环境中,变量的值可能会被其他线程改变,导致应用程序读取到的值和实际的值不一致。使用volatile修饰的变量,系统每次使用它时都是直接从对应的内存中提取,而不会利用缓存。

  • volatile保证了变量的内存可见性,所有的线程都能看到共享内存的最新状态;
  • 有序性
  • 不具备原子性,不能保证操作的原子性

14. finally块中的代码什么时候被执行

finally中的代码块在return前执行。

15. Java是否存在内存泄露问题

内存泄露指的是一个不在被程序使用的对象或者变量还在内存中占有存储空间。在Java语言中引用了垃圾回收机制,由垃圾回收器负责回收不在使用的对象。

  • 在Java语言中判断连接回收的标准有两个:第一,给对象赋予了空值,以后再也没有被使用过;第二,给对象赋予了新值,重新分配了内存空间。
  • 内存泄露的情况主要有两种:一是在堆内存中申请的空间没有被释放;二是对象已经不在被使用了,还仍然在内存中保留者。垃圾回收机制解决了第一种问题,因此Java中的内存泄露主要指第二种情况。
  • 容易引起内存泄露的情况:静态集合;各种连接(如数据库连接,网络连接,IO连接);监听器;单例模式