java变量命名规则
线程的各种状态
并发和并行的区别
解释一
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
所以我认为它们最关键的点就是:是否是『同时』。
解释二
Erlang 之父 Joe Armstrong 用一张5岁小孩都能看懂的图解释了并发与并行的区别

并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的。
有评论里说,并发是不是一个线程,并行是多个线程?
答:并发和并行都可以是很多个线程,就看这些线程能不能司时被(多个)cpu执行,如果可以就说明是并行,而并发是多个线程被(一个)cpu轮流切换着执行。
JVM JRE和JDK区别与联系
首先 三者之间存在包含关系
JVM + 核心类库 = JRE
JRE + java开发工具(javac.exe/jar.exe) = JDK
什么是JVM?
Java Virtual Machine 即Java虚拟机
我们知道Java语言有一个独特的优点就是可以跨平台
像其它语言,比如C,我们要针对不同操作系统windows,mac……各出一套应用程序
而Java则可以做到一个软件在任何的操作系统中都能执行,这就是JVM的功劳
如下图

图片来自高新强老师JAVA课程
本来我们编写的Java代码计算机还是不认识的,但是我们在每一个操作系统上都会配置一个与之相对应的JVM,会帮我们把我们的Java代码翻译成对应操作系统可以识别的内容。
所以说我们在第一次写Java程序时都要先把JVM给装好。
什么是JRE?
Java Runtime Environment 即Java运行环境
JVM + 核心类库 = JRE
刚才不是说只需要装JVM吗?那这个JRE是个什么鬼东西?
是因为只有JVM不能运行,它还需要核心类库,才能保证Java运行
由于JRE包含JVM 因此我们只要直接安装JRE 就顺便把JVM安装了

图片来自高新强老师JAVA课程
什么是JDK?
Java Development Kit 即Java开发工具包
JRE + java开发工具(javac.exe/jar.exe) = JDK
这是因为我们是开发人员,我们是写软件的,软件光能运行不行啊,得给我们一个地方让我们来写代码吧?所以就需要java开发工具给我们腾出一个地儿来,好让我们coding

图片来自高新强老师Java网课
面向过程和面向对象的区别
1. 面向过程
面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。

举个例子,下五子棋,面向过程的设计思路是首先分析解决这个问题的步骤:
(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。
用函数实现上面一个一个的步骤,然后在下五子棋的主函数里依次调用上面的函数(不同的编程语言有不同的调用方法,我这里写的是直接调用):
下五子棋{
开始游戏();
黑子先走();
绘制画面();
判断输赢();
轮到白子();
绘制画面();
判断输赢();
返回到 黑子先走();
输出最后结果;
}
可见,面向过程始终关注的是怎么一步一步地判断棋局输赢的,通过控制代码,从而实现函数的顺序执行。
2. 面向对象
在日常生活或编程中,简单的问题可以用面向过程的思路来解决,直接有效,但是当问题的规模变得更大时,用面向过程的思想是远远不够的。所以慢慢就出现了面向对象的编程思想。世界上有很多人和事物,每一个都可以看做一个对象,而每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。

在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:
(1)黑白双方,这两方的行为是一样的。
(2)棋盘系统,负责绘制画面
(3)规则系统,负责判定犯规、输赢等。
然后赋予每个对象一些属性和行为:
(4)第一类对象(黑白双方)负责接受用户输入,并告知第二类对象(棋盘系统)棋子布局的变化,棋盘系统接收到了棋子的变化,并负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以看出,面向对象是以功能来划分问题,而不是以步骤解决。比如绘制画面这个行为,在面向过程中是分散在了多个步骤中的,可能会出现不同的绘制版本,所以要考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘系统这个对象中出现,从而保证了绘图的统一。
3. 优缺点比较
面向过程
优点:
流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果,具体步骤清楚,便于节点分析。
效率高,面向过程强调代码的短小精悍,善于结合数据结构来开发高效率的程序。
缺点:
需要深入的思考,耗费精力,代码重用性低,扩展能力差,后期维护难度比较大。
面向对象
优点:
结构清晰,程序是模块化和结构化,更加符合人类的思维方式;
易扩展,代码重用率高,可继承,可覆盖,可以设计出低耦合的系统;
易维护,系统低耦合的特点有利于减少程序的后期维护工作量。
缺点:
开销大,当要修改对象内部时,对象的属性不允许外部直接存取,所以要增加许多没有其他意义、只负责读或写的行为。这会为编程工作增加负担,增加运行开销,并且使程序显得臃肿。
性能低,由于面向更高的逻辑抽象层,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小都开销很大。

举例说明两者的优缺点,比如在五子棋游戏中增加悔棋的功能。在面向过程中,从输入到显示再到最后判断的整个步骤都要改动,甚至函数的调用顺序也要改动,而在面向对象的设计中,只需在棋盘系统中增加一个回溯的功能就可以了,黑白双方和规则系统的属性和行为都不需改动。这个例子说明了面向对象程序设计中代码间的相关性低(低耦合特性),使得代码很容易被复用和扩展,同时也说明了面向过程的代码重用性低、扩展能力差。
Java程序编译运行过程
java程序执行过程分为两步,下图为流程示意图
第一步:将java源码(.java文件)通过编译器(javac.exe)编译成JVM文件(.class文件)
第二步:将JVM文件通过java.exe执行,输出结果

通过如上分析,我们发现JVM至关重要,其向上屏蔽了操作系统的差异,也正因为JVM的该作用,才使java这门编程语言能够实现跨平台,
其原理大致可描述为如下:

Java抽象类abstract
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
通常只有继承才能实现类的功能。
Java访问修饰符
通过以下表来说明访问权限:
修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不同包) | 其他包 |
---|---|---|---|---|---|
public |
Y | Y | Y | Y | Y |
protected |
Y | Y | Y | Y/N(说明) | N |
default |
Y | Y | Y | N | N |
private |
Y | N | N | N | N |
说明:
- 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
- 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。