目录
- 前言
- Java基础
-
- 面向对象和面向过程的区别
- Java语言有哪些特点?
- 关于JVM、JDK和JRE最详细通俗的解答
- Java 和 C++ 的区别
- 什么是主类?Java 应用程序和 Java 小程序的主类有何不同?
- Java应用程序与小程序之间有哪些差别?
- 字符型常量和字符串常量的区别?
- 构造器 Constructor 是否可被 override?
- 重载和重写的区别
- 编译期与运行期
- 继承
- 多态
- String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的?
- 自动装箱与拆箱
- 在一个静态方法内调用一个非静态成员为什么是非法的?
- 在 Java 中定义一个不做事且没有参数的构造方法的作用
- 接口的演变
- 成员变量与局部变量的区别有哪些
- 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
- == 与 equals(重要)
- hashCode 与 equals(重要)
- 为什么 Java 中只有值传递?
- 简述线程、程序、进程的基本概念。以及他们之间关系是什么?
- 线程有哪些基本状态?
- 关于final关键字的一些总结
- Java中的异常处理
- Java序列化中如果有些字段不想进行序列化该怎么办?
- 获取键盘输入常用的两种方法
- Java中IO流
- BIO,NIO,AIO有什么区别?
- 深拷贝vs浅拷贝
- Java集合
前言
本文为《JavaGuide面试突击版》的阅读笔记,会带有笔者的理解和一些扩展的东西。
作者公众号:JavaGuide
原作链接:https://github.com/Snailclimb/JavaGuide
Java基础
面向对象和面向过程的区别
- 面向过程:没有面向对象易维护、易复用、易扩展。
- 面向对象:易维护、易复用、易扩展。因为面向对象有封装、继承、多态的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
补充:Java性能差的主要原因并不是它是面向对象语言,而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码。
而面向过程语言大多都是直接编译成机械码在电脑上执行,并且其它一些面向过程的脚本语言性能也并不一定比Java好。
Java语言有哪些特点?
- 简单易学
- 面向对象(封装、继承、多态)
- 平台无关性
- 可靠性
- 安全性
- 支持多线程
- 支持网络编程且很方便(Java本身就是为简化网络编程设计的)
- 编译与解释并存
关于JVM、JDK和JRE最详细通俗的解答
Java程序从源代码到运行一般有下面三步:
JVM
Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
什么是字节码?采用字节码的好处是什么?
在Java中,JVM可以理解的代码就叫做字节码(即扩展名为.class的文件),他不面向任何特定的处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无需重新编译便可在多种不同操作系统的计算机上运行。
编译型语言和解释型语言
详见文章:编译型语言和解释型语言
对于上图,我们需要格外注意的是 .class->机器码 这一步。
在这一步JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。
而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了JIT编译器,而JIT属于运行时编译。
当JIT编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。
而我们知道,机器码的运行效率肯定是高于Java解释器的。这也解释了我们为什么经常会说Java是编译与解释共存的语言。
JIT编译器,英文写作Just-In-Time Compiler,中文意思是即时编译器。
JIT是一种提高程序运行效率的方法。
通常,程序有两种运行方式:静态编译与动态解释。
静态编译的程序在执行前全部被翻译为机器码,而动态解释执行的则是一句一句边运行边翻译。
HotSpot 采用了惰性评估(Lazy Evaluation)的做法:如果一段代码频繁的调用方法,或是一个循环,也就是这段代码被多次执行,JIT 编译器会参与其中,而如果一个方法从来不被执行,则不会经过 JIT 编译。
根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。
二八定律是19世纪末20世纪初意大利经济学家帕累托发现的。
他认为,在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的,因此又称二八定律。
JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。
JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。
JDK 支持分层编译和 AOT 协作使用。但是,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。
总结
字节码和不同系统的 JVM 实现是 Java 语言 “一次编译,随处可以运行” 的关键所在。
JDK 和 JRE的关系
简单来说:
具体来说:
一般情况下,如果你只是为了运行一下 Java 程序的话,那么你只需要安装 JRE 就可以了。有时,即使你不打算在计算机上进行任何 Java 开发,仍需要安装 JDK。例如,如果要使用 JSP 部署 WEB 应用程序,应用程序服务器会将 JSP 转换成 Java servlet,servlet 需要使用 JDK 来编译。
Java 和 C++ 的区别
- 都是面向对象的语言,都支持封装、继承和多态。
- Java 不提供指针来直接访问内存,程序内存更加安全。
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
- Java 有自动内存管理机制,不需要程序员手动释放无用内存。
- 在 C 语言中,字符串或字符数组最后都会有一个额外的字符 ‘\0’ 来表示结束。但是,Java 语言中没有结束符这一概念。
什么是主类?Java 应用程序和 Java 小程序的主类有何不同?
- 主类是 Java 程序执行的入口点,一个程序只能有一个主类。
- 在 Java 应用程序中,主类是指包含 main() 方法的类,而不一定要求该类是 public 类,但小程序的主类要求必须是 public 类。
- 在 Java 小程序中,主类是一个继承自系统类 JApplet 或 Applet 的子类。
Java应用程序与小程序之间有哪些差别?
- 应用程序从主线程启动(也就是 main() 方法)。
- Applet 小程序没有 main() 方法,主要是嵌在浏览器页面上运行(调用 init() 或者 run() 来启动)。
字符型常量和字符串常量的区别?
- 形式上:字符型常量是单引号引起的一个字符;字符串常量是双引号引起的若干个字符。
- 含义上:字符常量相当于一个整型值(ASCII 值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放位置)
- 占内存大小:字符常量只占 2 个字节;字符串常量占若干个字节。
构造器 Constructor 是否可被 override?
Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。
重载和重写的区别
- 重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。
- 重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变。
区别点 | 重载方法 | 重写方法 |
---|---|---|
发生范围 | 同一个类 | 子类中 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可修改 | 一定不能修改 |
异常 | 可修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问修饰符 | 可修改 | 一定不能做更严格的限制(可以降低限制) |
发生阶段 | 编译期 | 运行期 |