|
27 | 27 | 7. 高效性(通过 Just In Time 编译器等技术的优化,Java 语言的运行效率还是非常不错的); |
28 | 28 | 8. 支持网络编程并且很方便; |
29 | 29 | 9. 编译与解释并存; |
30 | | -10. ...... |
| 30 | +10. …… |
31 | 31 |
|
32 | 32 | > **🐛 修正(参见:[issue#544](https://github.com/Snailclimb/JavaGuide/issues/544))**:C++11 开始(2011 年的时候),C++就引入了多线程库,在 windows、linux、macos 都可以使用`std::thread`和`std::async`来创建线程。参考链接:http://www.cplusplus.com/reference/thread/thread/?kw=thread |
33 | 33 |
|
@@ -70,7 +70,7 @@ JRE(Java Runtime Environment) 是 Java 运行时环境。它是运行已编 |
70 | 70 |
|
71 | 71 | ### 什么是字节码?采用字节码的好处是什么? |
72 | 72 |
|
73 | | -在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 `.class` 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和C、 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。 |
| 73 | +在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 `.class` 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C、 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。 |
74 | 74 |
|
75 | 75 | **Java 程序从源代码到运行的过程如下图所示**: |
76 | 76 |
|
@@ -185,7 +185,7 @@ JDK 9 引入了一种新的编译模式 **AOT(Ahead of Time Compilation)** 。 |
185 | 185 | - Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。 |
186 | 186 | - Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。 |
187 | 187 | - C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载(操作符重载增加了复杂性,这与 Java 最初的设计思想不符)。 |
188 | | -- ...... |
| 188 | +- …… |
189 | 189 |
|
190 | 190 | ## 基本语法 |
191 | 191 |
|
@@ -320,7 +320,7 @@ System.out.println("左移 10 位后的数据对应的二进制字符 " + Intege |
320 | 320 |
|
321 | 321 | 输出: |
322 | 322 |
|
323 | | -``` |
| 323 | +```plain |
324 | 324 | 初始数据:-1 |
325 | 325 | 初始数据对应的二进制字符串:11111111111111111111111111111111 |
326 | 326 | 左移 10 位后的数据 -1024 |
@@ -384,7 +384,7 @@ System.out.println("左移 10 位后的数据对应的二进制字符 " + Intege |
384 | 384 |
|
385 | 385 | 运行结果: |
386 | 386 |
|
387 | | -``` |
| 387 | +```plain |
388 | 388 | 0 |
389 | 389 | xixi |
390 | 390 | 1 |
@@ -681,16 +681,13 @@ System.out.println(l + 1 == Long.MIN_VALUE); // true |
681 | 681 | - **生存时间**:从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。 |
682 | 682 | - **默认值**:从变量是否有默认值来看,成员变量如果没有被赋初始值,则会自动以类型的默认值而赋值(一种情况例外:被 `final` 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。 |
683 | 683 |
|
684 | | -> 问:为什么成员变量有默认值? |
685 | | -> |
686 | | -> 答: |
687 | | -> |
688 | | -> 1. 先不考虑变量类型,如果没有默认值会怎样?变量存储的是内存地址对应的任意随机值,程序读取该值运行会出现意外。 |
689 | | -> |
690 | | -> 2. 默认值有两种设置方式:手动和自动,根据第一点,没有手动赋值一定要自动赋值。成员变量在运行时可借助反射等方法手动赋值,而局部变量不行。 |
691 | | -> |
692 | | -> 3. 对于编译器(javac)来说,局部变量没赋值很好判断,可以直接报错。而成员变量可能是运行时赋值,无法判断,误报“没默认值”又会影响用户体验,所以采用自动赋默认值。 |
693 | | -> |
| 684 | +**为什么成员变量有默认值?** |
| 685 | + |
| 686 | +1. 先不考虑变量类型,如果没有默认值会怎样?变量存储的是内存地址对应的任意随机值,程序读取该值运行会出现意外。 |
| 687 | + |
| 688 | +2. 默认值有两种设置方式:手动和自动,根据第一点,没有手动赋值一定要自动赋值。成员变量在运行时可借助反射等方法手动赋值,而局部变量不行。 |
| 689 | + |
| 690 | +3. 对于编译器(javac)来说,局部变量没赋值很好判断,可以直接报错。而成员变量可能是运行时赋值,无法判断,误报“没默认值”又会影响用户体验,所以采用自动赋默认值。 |
694 | 691 |
|
695 | 692 | 成员变量与局部变量代码示例: |
696 | 693 |
|
@@ -776,7 +773,7 @@ public class StringExample { |
776 | 773 |
|
777 | 774 | 输出: |
778 | 775 |
|
779 | | -``` |
| 776 | +```plain |
780 | 777 | 字符型常量占用的字节数为:2 |
781 | 778 | 字符串常量占用的字节数为:13 |
782 | 779 | ``` |
@@ -1022,7 +1019,7 @@ public class VariableLengthArgument { |
1022 | 1019 |
|
1023 | 1020 | 输出: |
1024 | 1021 |
|
1025 | | -``` |
| 1022 | +```plain |
1026 | 1023 | ab |
1027 | 1024 | a |
1028 | 1025 | b |
|
0 commit comments