一、内部类
1、Inner Class
class Outer{
class Inner{
}
}
内部类实例无法单独存在,必须依赖于外部类
- Inner Class的作用在外部类的内部,可以访问private字段,并且可以修改private字段
- java编译为.class文件,Outer类被编译成Outer.class, Inner 类被编译成 Outer$Inner.class
2、匿名类(Anonymous Class)
- 继承接口
Runnable r = new Runnable(){
//Runnable是一个接口,接口是无法实例的,这里是定义一个匿名类
//覆写方法
}
- 继承普通类
HashMap<String, String> map1 = new HashMap<>();
HashMap<String, String> map2 = new HashMap<>() {}; // 匿名类!
HashMap<String, String> map3 = new HashMap<>() { //匿名类,同时定义了静态方法
{
put("A", "1");
put("B", "2");
}
};
System.out.println(map3.get("A"));
}
3、静态内部类(static nested class)
-
用在外部类中定义静态内部类,用static字段修饰
-
静态内部类不在依附外部类,是一个独立的类,类比于静态字段,但是可以访问外部类的private方法和字段
public static void main(String[] args){ Outer.StaticNested sn = new Outer.StaticNested(); sn.hello(); } class Outer{ static class StaticNested{ void hello(){ System.out.println("Say Hello!"); } } }
二、classpath和jar
- classpath是JVM用到的一个环境变量,用来搜索class文件
- windows下环境变量用
;
隔开,如果路径中有空格,用""
包裹 - linux系统下环境变量用
:
隔开
1、设定classpath
- 在环境变量中设置
- 在编译jar包的时候设置,用
-classpath
或者-cp
指定路径 - 不要把任何Java核心库添加到classpath中!JVM根本不依赖classpath加载核心库!
2、jar包
jar包可以把package
组织的目录层级,以及各个目录下的所有文件(包括.class
文件和其他文件)都打成一个jar文件,实际上jar包就是个zip压缩包
制作jar包
直接在资源管理器中,找到正确的目录,点击右键,在弹出的快捷菜单中选择“发送到”,“压缩(zipped)文件夹”,就制作了一个zip文件,然后将zip后缀改成jar后缀
3、MANIFEST.MF文件
jar包还可以包含一个特殊的/META-INF/MANIFEST.MF
文件,MANIFEST.MF
是纯文本,可以指定Main-Class
和其它信息。JVM会自动读取这个MANIFEST.MF
文件,如果存在Main-Class
,我们就不必在命令行指定启动的类名
三、模块
1、编写模块
创建模块,这个过程与创建java项目是一样的, 创建完成之后,会比java项目在src目录下多了一个module-info.java
这个模块
2、打包JRE
- 打包成JRE文件用jlink
jlink --module-path hello.jmod --add-modules java.base,java.xml,hello.world --output jre/
--module-path
指定模块位置,--add-modules
指定依赖的模块,---output
指定输出目录
-
运行JRE
在jre目录下,通过
jre/bin/java --module hello.jmod
运行
3、访问权限
-
在class类中,访问权限分为
public
,private
,protected
,包默认的访问权限
-
在模块中,需要在依赖中即
module-info.java
文件中添加exports
,使得别的模块能有访问的权限
module hello.world {
exports com.itranswarp.sample;
requires java.base;
requires java.xml;
}