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 修饰一个类时,表明这个类不能被继承。