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