1:什么是JVM,JDK 和 JRE 的区别是什么?

  1. Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。
  2. JVM 有针对不同系统的特定实现(WindowsLinuxmacOS),目的是使用相同的字节码,它们都会给出相同的结果。
  3. JDK Java Development Kit,它是功能齐全的 Java SDK
  4. 它能够创建和编译程序,拥有 JRE ,编译器(javac)和工具(如 javadoc jdb)。
  5. JREJava Runtime Environment,运行已编译 Java 程序所需的内容的集合。
  6. 它不能创建文件,包含JVMJava 类库,java 命令和一些基础构件。
  7. 为什么最好还是安装JDK
  8. 特例:JSP 部署 Web 应用程序,应用程序服务器会将 JSP 转换为 Java servlet,并且需要使用 JDK 来编译 servlet

2:什么是字节码?为什么要采用字节码?

  1. Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机
  2. 由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。

3:Java 程序从源代码到运行的步骤

image.png

image.png

  1. 1Java源代码
  2. 2:经过JDKJavac 编译
  3. 3:字节码文件(.class
  4. 4JVM 类加载器 进行加载字节码文件
  5. 5:方法:解释:
  6. 1:解释器 逐行解释执行
  7. 2:机器可执行的二进制机器码
  8. 5:方法:编译:
  9. 后续引进:JIT即时编译器(Just In Time Compiler
  10. 处理热点代码(一次编译 多次执行)
  11. 2JIT 运行时进行编译
  12. 3:机器可执行的二进制机器码
  13. 4:编译完成后机器码保留
  14. 5:机器码下次可以直接使用
  15. 了解:
  16. HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分;

4:Java 和 C++的区别?

  1. 相同点:都是面向对象的语言,都支持封装、继承和多态;
  2. 不同点:
  3. 1Java 有自动内存管理机制,不需要程序员手动释放无用内存。
  4. 2Java 不提供指针来直接访问内存,程序内存更加安全;
  5. 3Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承;

5:重载和重写的区别?

  1. 重载:同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理; (编译期)
  2. 重写:子类继承自父类,方法名相同、形参列表相同一样,要覆盖父类方法; (运行期)
  3. 重写注意:
  4. 1:父类方法访问修饰符为 private/final/static 则子类就不能重写该方法
  5. 2:子类的返回值类型 或者 抛出的异常范围 小于等于父类,
  6. 但访问修饰符范围大于等于父类(不然子类没有意义)。
区别点 重载方法 重写方法
发生范围 同一个类 子类
参数列表 必须修改 不能修改
返回类型 可修改 返回值类型应 小于或相等 父类
异常 可修改 声明抛出的异常类应 小于或相等 父类
访问修饰符 可修改 声明抛出的异常类应 小于或相等 父类
异常 可修改 修饰符范围大于等于父类
发生阶段 编译期 运行期

6:Java 面向对象编程三大特性: 封装 继承 多态

  1. 封装:把一个对象的属性私有化,同时提供或者不提供一些被外界访问的属性的方法;
  2. 继承:单继承,继承父类的属性以及方法,可以重写方法;
  3. 但对于父类中的私有属性和方法子类是无法访问,只是拥有。
  4. 多态:在编译期不确定,在程序运行期才确定
  5. 具体使用:继承(多个子类对同一方法的重写)
  6. 接口(实现接口并覆盖接口中同一方法)。

7:String对象 创建的区别

  1. String str1="abc" String str2=new String("abc")一样吗?
  2. str1 str2 相等吗?
  3. 1:先检查字符串常量池中有没有"abc:"
  4. 如果没有,则创建一个,然后 str1 指向字符串常量池中的对象,
  5. 如果有,则直接将 str1 指向字符串常量池中的"abc"
  6. 2:直接在堆内存空间创建一个新的对象 str2
  7. 不一样:一个是常量池中的 String 对象 一个是堆内存中的 String对象

8:String 为什么是不可变的? String StringBuilder 和 StringBuffer 的区别是什么?

  1. 他们都用 private char value[] 保存字符串;
  2. String里面使用了final 关键字修饰字符数组来保存字符串;
  3. StringBuilder StringBuffer 都继承自 AbstractStringBuilder 类, 但没有使用final修饰;
  4. StringBuilder:没加同步锁,非线程安全;
  5. StringBuffer:加同步锁,线程安全;
  6. 性能:
  7. String 类型进行改变的时候,都会生成 将指针 指向新的String对象;
  8. StringBuilder StringBuffer 操作自身
  9. StringBuilder StringBuffer 的性能提供了10%~15% 但线程不安全;

9:接口和抽象类的区别是什么?

  1. 1:接口的方法默认是 public,所有方法在接口中不能有实现,
  2. 而抽象类可以有非抽象的方法;
  3. 2:接口中除了 staticfinal 变量,不能有其他变量,
  4. 而抽象类可以有;
  5. 3:接口是对行为的抽象,是一种行为的规范,
  6. 而抽象是对类的抽象,是一种模板设计;
  7. 4:一个类可以实现多个接口,但只能继承一个抽象类;
  8. 注意:jdk8 的时候接口可以有默认方法和静态方法功能。
  9. 抽象类就相当于一个模板,模板中有子类可以公用的部分,
  10. 也有需要子类自行实现的部分,是为模板式设计,它同时具有多态性+复用性;
  11. 抽象类中方法 调用抽象类中其他实现的方法。
  12. 接口是对行为的抽象,它只定义一组行为规范,每个实现类都要实现所有规范,叫辐射式设计,它只有多态性;

10:抽象类必须要有抽象方法吗?可以用final 修饰吗?

  1. 抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类。
  2. 不能用final修饰抽象类,当用 final 修饰一个类时,表明这个类不能被继承。