Java基础笔记一


基础概念:

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。

image-20210906163931361

需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言

JRE、JDK:

JRE(Java Runtime Environment)是Sun的产品,是可以在其上运行、测试和传输应用程序的 Java 平台。它不包含开发工具(JDK)--编译器、调试器和其它工具

JDK 是 Java Development Kit 缩写,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。

跑程序只需要装 JRE,开发环境装 JDK。

基本程序设计结构:

从 Java 7 开始, 加上前缀 0b 或 0B 就可以写二进制数。 例如,0b1001就是 9。另外,同样是从 Java 7 开始,还可以为数字字面量加下划线, 如:

int a = 10_0000_0000;

Java 没有任何无符号(unsigned) 形式的 int、 long、 short 或 byte 类型。

char 类型的值可以表示为十六进制值,其范围从 \u0000 到 \uffff 。例如:\u2122 表示注册符号 (™ ) 。Unicode转义会在解析之前得到处理。汉字是包括不下的。

运算符:

// 余数应该大于0,设计问题,并不是
// 可以用floorMod
int a = 13 % 12; // 1
int b = (-11) % 12; // -11
int c = Math.floorMod(-11, 12); // 1

比较字符串用equals==比较的只是字符串是否在同一位置。空串""null不一样。

代码点(Code Point):在 Unicode 代码空间中的一个值,取值 0x0 至 0x10FFFF,代表一个字符。

代码单元(Code Unit):在具体编码形式中的最小单位。比如 UTF-16 中一个 code unit 为 16 bits,UTF-8 中一个 code unit 为 8 bits。一个 code point 可能由一个或多个 code unit(s) 表示。在 U+10000 之前的 code point 可以由一个 UTF-16 code unit 表示,U+10000 及之后的 code point 要由两个 UTF-16 code units 表示。

如,字符𝕆16位的char放不下

String s = "\uD835\uDD46卍";
char c = s.charAt(0); //输出为?

// ============ 遍历码点
String s = "\uD835\uDD46卍";
int []codePoints = s.codePoints().toArray();
System.out.println(codePoints.length); //输出为2

基本读写文件:

Scanner in = new Scanner(Paths.get("a.txt"),"UTF-8");
PrintWriter out = new PrintWriter("b.txt","UTF-8");
String s = in.nextLine();
out.println(s);
out.close();
in.close();

大数值BigIntegerBigDecimal

继承:

方法的名字和参数列表称为方法的签名。例如,f(int)f(String)是两个具有相同名字, 不同签名的方法。如果在子类中定义了一个与超类签名相同的方法, 那么子类中的这个方法就覆盖了超类中的这个相同签名的方法。

阻止继承:final 类和方法。如果将一个类声明为 final, 只有其中的方法自动地成为 final,而不包括域。