1:什么是JVM,JDK 和 JRE 的区别是什么?
    Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。    JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。    JDK 是 Java Development Kit,它是功能齐全的 Java SDK。    它能够创建和编译程序,拥有 JRE ,编译器(javac)和工具(如 javadoc 和 jdb)。   JRE是Java Runtime Environment,运行已编译 Java 程序所需的内容的集合。   它不能创建文件,包含JVM,Java 类库,java 命令和一些基础构件。  为什么最好还是安装JDK  特例:JSP 部署 Web 应用程序,应用程序服务器会将 JSP 转换为 Java servlet,并且需要使用 JDK 来编译 servlet。
2:什么是字节码?为什么要采用字节码?
    在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机    由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
3:Java 程序从源代码到运行的步骤


1:Java源代码 2:经过JDK中Javac 编译3:字节码文件(.class)4:JVM 类加载器     进行加载字节码文件5:方法:解释:     1:解释器      逐行解释执行     2:机器可执行的二进制机器码5:方法:编译:     后续引进:JIT即时编译器(Just In Time Compiler)     处理热点代码(一次编译 多次执行)     2:JIT      运行时进行编译     3:机器可执行的二进制机器码     4:编译完成后机器码保留     5:机器码下次可以直接使用     了解:    HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分;
4:Java 和 C++的区别?
相同点:都是面向对象的语言,都支持封装、继承和多态;不同点:    1:Java 有自动内存管理机制,不需要程序员手动释放无用内存。    2:Java 不提供指针来直接访问内存,程序内存更加安全;    3:Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承;
5:重载和重写的区别?
 重载:同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理; (编译期)  重写:子类继承自父类,方法名相同、形参列表相同一样,要覆盖父类方法; (运行期) 重写注意:      1:父类方法访问修饰符为 private/final/static 则子类就不能重写该方法   2:子类的返回值类型 或者  抛出的异常范围   小于等于父类,       但访问修饰符范围大于等于父类(不然子类没有意义)。
| 区别点 | 
重载方法 | 
重写方法 | 
| 发生范围 | 
同一个类 | 
子类 | 
| 参数列表 | 
必须修改 | 
不能修改 | 
| 返回类型 | 
可修改 | 
返回值类型应 小于或相等 父类 | 
| 异常 | 
可修改 | 
声明抛出的异常类应 小于或相等 父类 | 
| 访问修饰符 | 
可修改 | 
声明抛出的异常类应 小于或相等 父类 | 
| 异常 | 
可修改 | 
修饰符范围大于等于父类 | 
| 发生阶段 | 
编译期 | 
运行期 | 
6:Java 面向对象编程三大特性: 封装 继承 多态
封装:把一个对象的属性私有化,同时提供或者不提供一些被外界访问的属性的方法;继承:单继承,继承父类的属性以及方法,可以重写方法;        但对于父类中的私有属性和方法子类是无法访问,只是拥有。多态:在编译期不确定,在程序运行期才确定具体使用:继承(多个子类对同一方法的重写)            接口(实现接口并覆盖接口中同一方法)。
7:String对象  创建的区别
    String str1="abc"与 String str2=new String("abc")一样吗?    str1 和 str2 相等吗?    1:先检查字符串常量池中有没有"abc:",         如果没有,则创建一个,然后 str1 指向字符串常量池中的对象,         如果有,则直接将 str1 指向字符串常量池中的"abc";    2:直接在堆内存空间创建一个新的对象 str2。  不一样:一个是常量池中的 String 对象  一个是堆内存中的 String对象
8:String 为什么是不可变的? String  StringBuilder 和 StringBuffer 的区别是什么?
    他们都用  private char value[] 保存字符串;    String里面使用了final 关键字修饰字符数组来保存字符串;    StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类, 但没有使用final修饰;    StringBuilder:没加同步锁,非线程安全;    StringBuffer:加同步锁,线程安全;性能:String 类型进行改变的时候,都会生成 并 将指针 指向新的String对象;StringBuilder 与 StringBuffer 操作自身StringBuilder 比 StringBuffer 的性能提供了10%~15% 但线程不安全;
9:接口和抽象类的区别是什么?
    1:接口的方法默认是 public,所有方法在接口中不能有实现,        而抽象类可以有非抽象的方法;    2:接口中除了 static、final 变量,不能有其他变量,        而抽象类可以有;    3:接口是对行为的抽象,是一种行为的规范,       而抽象是对类的抽象,是一种模板设计;    4:一个类可以实现多个接口,但只能继承一个抽象类;注意:jdk8 的时候接口可以有默认方法和静态方法功能。   抽象类就相当于一个模板,模板中有子类可以公用的部分,  也有需要子类自行实现的部分,是为模板式设计,它同时具有多态性+复用性;  抽象类中方法 调用抽象类中其他实现的方法。 接口是对行为的抽象,它只定义一组行为规范,每个实现类都要实现所有规范,叫辐射式设计,它只有多态性;
10:抽象类必须要有抽象方法吗?可以用final 修饰吗?
抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类。不能用final修饰抽象类,当用 final 修饰一个类时,表明这个类不能被继承。