在前面的代码中,我们把类和接口命名为Person、Student、Hello等简单名字。 在现实中,如果小明写了一个Person类,小红也写了一个Person类,现在,小白既想用小明的Person,也想用小红的Person,怎么办? 如果小军写了一个Arrays类,恰好JDK也自带了一个Arrays类,如何解决类名冲突? 在Java中,我们使用package来解决名字冲突。 Java定义了一种名字
包

作用域

在Java中,我们经常看到public、protected、private这些修饰符。在Java中,这些修饰符可以用来限定访问作用域。 public 定义为public的class、interface可以被其他任何类访问: package abc; public class Hello { public void hi() { } } 上面的Hello是public,因此,可以被其他包的类访问:
作用域

内部类

在Java程序中,通常情况下,我们把不同的类组织在不同的包下面,对于一个包下面的类来说,它们是在同一层次,没有父子关系: java.lang ├── Math ├── Runnable ├── String └── ... 还有一种类,它被定义在另一个类的内部,所以称为内部类(Nested Class)。Java的内部类分为好几种,通常情况用得不多,但也需要了解它们是如何使用的。 Inner Cl
内部类

classpath和jar

在Java中,我们经常听到classpath这个东西。网上有很多关于“如何设置classpath”的文章,但大部分设置都不靠谱。 到底什么是classpath? classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class。 因为Java是编译型语言,源码文件是.java,而编译后的.class文件才是真正可以被JVM执行的字节码。因此,JVM需要知道,如果要加载一个abc.x
classpath和jar

class版本

在Java开发中,许多童鞋经常被各种版本的JDK搞得晕头转向,本节我们就来详细讲解Java程序编译后的class文件版本问题。 我们通常说的Java 8,Java 11,Java 17,是指JDK的版本,也就是JVM的版本,更确切地说,就是java.exe这个程序的版本: $ java -version java version "17" 2021-09-14 LTS 而每个版本的JVM,它能执行
class版本

模块

从Java 9开始,JDK又引入了模块(Module)。 什么是模块?这要从Java 9之前的版本说起。 我们知道,.class文件是JVM看到的最小可执行文件,而一个大型程序需要编写很多Class,并生成一堆.class文件,很不便于管理,所以,jar文件就是class文件的容器。 在Java 9之前,一个大型Java程序会生成自己的jar文件,同时引用依赖的第三方jar文件,而JVM自带的Ja
模块

字符串和编码

String 在Java中,String是一个引用类型,它本身也是一个class。但是,Java编译器对String有特殊处理,即可以直接用"..."来表示一个字符串: String s1 = "Hello!"; 实际上字符串在String内部是通过一个char数组表示的,因此,按下面的写法也是可以的: String s2 = new String(new char {'H', 'e',
字符串和编码

StringBuilder

Java编译器对String做了特殊处理,使得我们可以直接用+拼接字符串。 考察下面的循环代码: String s = ""; for (int i = 0; i < 1000; i++) { s = s + "," + i; } 虽然可以直接拼接字符串,但是,在循环中,每次循环都会创建新的字符串对象,然后扔掉旧的字符串。这样,绝大部分字符串都是临时对象,不但浪费内存,还会影响GC效率。 为
StringBuilder