模块化 模块的基本使用 模块的使用步骤 创建模块 在模块的src目录下新建一个名为module-info.java的描述文件,该文件专门定义模块名,访问权限,模块依赖等信息 描述性文件中使用模块导出和模块依赖来进行配置使用 模块中所有未导出的包都是模块私有的,不能在模块之外被访问 模块导出格式:exports 包名; 一个模块要访问其他模块,必须明确指定依赖哪些模块,未明确指定依赖的模块不能访问 模块依赖格式:requires 模块名; 注意:写模块名报错,需要按下Alt + Enter提示,然后选择模块依赖 模块服务的使用 模块服务的使用步骤 在模块A下创建一个包myInterface,在该包下提供一个接口Inter public interface Inter{ void run(); } 在myInterface包下创建一个包myImpl,在该包下提供接口的实现类Impl01 在模块A下的描述性文件中添加以下配置 模块导出:exports myInterface; 服务提供:provides Inter with Impl01 在模块B的描述性文件中添加以下配置 模块依赖:r.... 有更新! Java模块化与接口组成(十六) Java
反射 类加载器 概述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化,如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化。 类加载 就是指将class文件读入内存,并为之创建一个java.lang.Class对象 任何类被使用时,系统都会为之建立一个java.lang.Class对象 类的连接 验证阶段:用于验证被加载的类是否有正确的内部结构,并和其他类协调一致 准备阶段:负责为类的类变量分配内存,并设置默认初始值 解析阶段:将类的二进制数据中的符号引用替换为直接引用 类的初始化 概述:在此阶段,主要对类变量的初始化 类的初始化步骤: 假如类还未被加载和连接,则程序先加载并连接该类 假如该类的直接父类还未被初始化,则先初始化其直接父类 假如类中有初始化语句,则系统依次执行初始化语句 注意:在执行第2个步骤时,系统对直接父类的初始化步骤也遵循初始化步骤1-3 类的初始化时机: 创建类的实例 调用类的类方法 访问类或者接口的类变量,或者为该类变量赋值 使用反射方式来强制创建.... Java反射(十五) Java
Stream流 概述 Stream流的使用 生成流 通过数据源(集合,数组等)生成流 list.stream() 中间操作 一个流后面可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤/映射,然后返回一个新的流,交给下一个操作使用 filter() 终结操作 一个流只能有一个终结操作,当这个操作执行后,流就被使用 “光” 了,无法再被操作 forEach() Stream流的生成方式 Stream流常见生成方式 Collection体系的集合可以使用默认方法 stream() 生成流 default Stream<E> stream() Map体系的集合简介的生成流 Stream<K> keyStream = map.keySet().stream(); // Map键生成流 Stream<V> valueStream = map.values().stream(); // Map值生成流 Stream<Map.Entry<String,Integer>> entryStream = map.ent.... Java Stream流(十四) Java
函数式接口 概述 函数式接口:有且仅有一个抽象方法的接口 Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适合于Lambda使用的接口 只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导 @FunctionalInterface :函数式接口的注解 函数式接口作为方法的参数 如果方法的参数是一个函数式接口,则可以使用Lambda表达式作为参数传递 范例: // Runnable函数式接口作为方法的形式参数 public class RunnableDemo{ public static void main(String[] args){ useRunnable(() -> System.out.println("多线程程序启动了")); } private static void useRunnable(Runnable r){ new Thread(r).start; } } 函数式接口作为方法的返回值 如果方法的返回值是一个函数式接口,则可以使用Lambda表达式作为结果返回 范例: // 返回函数式接口Comparato.... Java函数式接口(十三) Java
方法引用 方法引用符 :: 该符号为引用运算符,而它所在的表达式被称为方法引用 范例: // Inter为接口,InterDemo为测试类 public interface Inter{ void run(String s); } public class InterDemo{ public static void main(String[] args){ getRun(System.out::println); } private static void getRun(Inter i){ i.run("java"); } } // 执行结果为java 引用类方法 概述:引用类方法,就是引用类的静态方法 格式:类名 :: 静态方法 Lambda表达式被类方法替代时,它的形式参数全部传递给静态方法作为参数 引用对象的实例方法 概述:引用对象的实例方法,就是引用类中的成员方法 格式:对象 :: 成员方法 Lambda表达式被对象的实例方法替代时,它的形式参数全部传递给该方法作为参数 引用类的实例方法 概述:引用类的实例方法,就是引用类中的成员方法 格式:类名 :: 成员方法 Lambda.... Java方法引用(十二) Java
Lambda表达式 Lambda表达式的标准格式 格式:(形式参数) -> {代码块} 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,则留空 -> :由英文中划线和大于符号组成,固定写法。代表指向动作 代码块:是具体要做的事情,即方法体内容 Lambda表达式的使用前提 有一个接口 接口中有且仅有一个抽象方法 Lambda表达式的省略模式 省略规则: 参数类型可以省略,但是有多个参数的情况下,不能只省略一个 如果参数有且仅有一个,那么小括号可以省略 如果代码块的语句只有一条,可以省略大括号和分号,若语句是return语句,则return关键字需要省略 Lambda表达式的注意事项 注意事项: 使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法 必须有上下文环境,才能推导出Lambda对应的接口 根据局部变量的赋值得知Lambda对应的接口: Runnable r = () -> {代码块}; 根据调用方法的参数得知Lambda对应的接口: new Thread(() -> {代码块}).start(); Lambda表达式和匿名.... 有更新! Java Lambda表达式(十一) Java
网络编程 网络编程入门 概述 在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换 网络编程三要素 IP地址 实现计算机的互相通信,必须为每台就是就是指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而IP地址就是计算机的标识号,也就是设备的标识。 端口 端口号可以唯一标识设备中的应用程序,也就是应用程序的标识。 协议 在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一的规定,通信双方必须同时遵守才能完成数据交换。通常的协议有UDP协议和TCP协议。 IP地址 特殊IP地址: 127.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用 InetAddress InetAddress:此类表示Internet协议(IP)地址 方法名说明 static InetaddressgetByName(String host)确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址 StringgetHostName()获取IP地址的主机名 StringgetHostAddress(.... Java网络编程(十) Java
多线程 实现多线程 进程 进程:是正在运行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源 线程 线程:是进程中的单个顺序控制流,是一条执行路径 单线程:一个进程如果只有一条执行路径,则称为单线程程序 多线程:一个进程如果有多条执行路径,则称为多线程程序 多线程的实现方式(一) 继承Thread类 定义一个类MyThread继承Thread类 在MyThread类中重写run()方法 创建MyThread类的对象 启动线程 重写run()方法的原因: 因为run()是用来封装被线程执行的代码 run()方法和strat()方法的区别: run():封装线程执行的代码,直接调用,相当于普通代码的调用 start():启动线程,然后由JVM调用此线程的run()方法 设置和获取线程名称 Thread类中设置和获取线程名称的方法 void setName(String name):将此线程的名称更改为等于参数name String getName():返回此线程的名称 通过Thread类的带参构造方法 Thread(String name) 设置线程名称.... Java多线程(九) Java
IO流 概述 IO:输入/输出(Input/Output) 流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输 IO流就是用来处理设备间数据传输问题的 常见的应用:文件复制、文件上传、文件下载 IO流分类: 按照数据的流向 输入流:读数据 输出流:写数据 按照数据类型 字节流:字节输入流、字节输出流 字符流:字符输入流、字符输出流 字节流: 字符流: File 概述 File:它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已,该路径可以是存在的,也可以是不存在的。 File类的构造方法 方法名说明 File(String pathname)通过将给定的路径名字字符串转换为抽象路径名来创建新的File实例 File(String parent,String child)从父路径名字符串和子路径名字符串创建新的File实例 File(File parent,String child)从父抽象路径名和子路径名字符串创建新的File实例 注意:路径的分.... 有更新! Java IO流(八) Java
集合基础 概述 集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发送改变。 ArrayList<E>: 可调整大小的数组实现 <E>:是一种特殊的数据类型,泛型 集合打印输出的结果不是对象,而是集合元素,格式为:[元素1,元素2,...] ArrayList的构造方法和添加方法 方法名说明 public ArrayList()创建一个空的集合对象 public boolean add(E e)将指定的元素追加到此集合的末尾 public void add(int index,E element)在此集合中的指定位置插入指定的元素,需注意集合索引越界问题 ArrayList集合常用方法 方法名说明 public boolean remove(Object o)删除指定的元素,返回删除是否成功 public E remove(int index)删除指定索引处的元素,返回被删除的元素 public E set(int index,E element)修改指定索引处的元素,返回被修改的元素 public E get(int index)返回指定索引处的.... 有更新! Java集合(七) Java
异常 概述 异常:就是程序出现了不正常的情况。 异常体系 Error:严重问题,不需要处理 Exception:称为异常类,它表示程序本身可以处理的问题 RuntimeException:在编译期是不检查的,出现问题后,需要回来改代码 非RuntimeException:编译期就必须处理的,否则程序不能通过编译,就更不能正常运行 JVM的默认处理方案 如果程序出现了问题,我们没有做任何处理,最终JVM会做默认处理。 把异常的名称,异常原因及异常出现的位置等信息输出在控制台上 程序停止执行 异常处理try...catch... 格式: try{ 可能出现异常的代码; }catch(异常类名 变量名){ 异常的处理代码; } 执行流程: 程序从try里面的代码开始执行 出现异常,会自动生成一个异常对象,该异常对象将被提交给Java运行时系统 当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理 执行完毕后,程序还可以继续往下执行 Throwable的成员方法 方法名说明 public StringgetMessage()返回此throwable的.... Java异常(六) Java
内部类 概述 内部类:就是在一个类中定义一个类。 内部类定义格式: public class 类名{ 修饰符 class 类名{ } } 内部类访问特点 内部类可以直接访问外部类的成员,包括私有 外部类要访问内部类的成员,必须创建对象 成员内部类 按照内部类在类中定义的位置不同,可以分为以下两种形式: 在类的成员位置:成员内部类 在类的局部位置:局部内部类 外部创建成员内部类对象的格式如下: 外部类名.内部类名 对象名 = 外部类对象.内部类对象 局部内部类 局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用 该类可以直接访问外部类的成员,也可以访问方法内的局部变量 匿名内部类 匿名内部类是局部内部类的一种 前提:存在一个类或者接口,这里的类可以是具体类,也可以是抽象类 格式: new 类名或者接口名(){ 重写方法; }; 本质:是一个继承了该类或者是实现了该接口的子类匿名对象 常用API Math 概述:Math类没有构造方法,查看帮助文档,可以直接调用静态的成员。 Math类的常用方法 方法名说明 public static intabs(i.... 有更新! Java内部类与常用API(五) Java
抽象类 概述 在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类 抽象类的特点 抽象类和抽象方法必须使用abstract关键字修饰 public abstract class 类名{} public abstract void 方法名(); 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类 抽象类不能实例化 抽象实例化的方法:参照多态的方式,通过子类对象实例化,称为抽象类多态 抽象类的子类 要么重写抽象类中的所有抽象方法 要么是抽象类 抽象类的成员特点 成员变量 可以是变量 也可以是常量 构造方法 有构造方法,但是不能实例化 构造方法主要用于子类访问,实现父类数据的初始化 成员方法 可以有抽象方法:限定子类必须完成抽象方法的实例化 也可以有非抽象方法:提高代码的复用性 接口 概述 接口是一种公共的规范标准,只要符合规范标准,大家都可以通用 Java中的接口更多的体现在对行为的抽象 接口的特点 接口用关键字interface修饰 public interface 接口名{} 类实现接口用implements表示 public clas.... 有更新! Java抽象类与接口(四) Java
Java概述 Java跨平台原理 在不同操作系统上运行Java程序,只需要安装与该操作系统对应的Java虚拟机(JVM),这样可以实现同一个Java程序在不同平台上运行,也就是Java的跨平台原理。 JRE与JDK JRE(Java Runtime Environment):Java程序运行时的环境,包含JVM和运行时所需的核心类库。 JDK(Java Development Kit):Java程序开发工具包,包含JRE和开发人员所使用的工具,其中开发工具包括编译工具javac.exe和运行工具java.exe。 JDK的安装目录 目录名称说明 bin存放了JDK的各种工具命令javac和java在此目录中 conf存放了JDK的相关配置文件 include存放了一些平台特定的头文件 jmods存放了JDK的各种模块 legal存放了JDK各模块的授权文档 lib存放了JDK工具的一些补充JAR包 基础语法 注释 单行注释 格式://注释信息 多行注释 格式:/*注释信息*/ 文档注释 格式:/**注释信息*/ 关键字 关键字:Java语言中赋予了特殊含义的单词 关键字的特点 关键字.... 有更新! Java基础语法(一) Java
字符串 API API概述 API(Application Programming Interface):应用程序接口 Java API:指的是JDK中提供的各种功能的Java类 java.lang下的类是不需要导包的。 API练习 调用方法时,如果方法有明确的返回值,我们用变量接收可以手动完成,也可以使用快捷键的方式完成(Ctrl+Alt+V)。 String String概述 String类在java.lang包下,所以使用的时候不需要导包。 String类代表字符串,Java程序中所有字符文字(例如“abc”)都被实现为此类的实例,也就是说,Java程序中所有的双引号字符串,都是String类的对象。 字符串的特点 字符串不可变,它们的值在创建后不能被更改。 虽然String的值是不可变的,但是它们可以被共享。 字符串效果上相当于字符组(char[]),但是底层原理是字节数组(byte[])。 String构造方法 方法名说明 public String()创建一个空白字符串对象,不含有任何内容 public String(char[] chs)根据字符数组的内容,来创建字符串对.... 有更新! Java字符串(三) Java