Java™教程Duke拿着一个牌子

Java教程已经针对JDK 8编写。本页面描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。

真正的大索引

Java™教程中的所有内容页面的列表

Oracle法律声明

教程:入门

Java技术现象
关于Java技术
Java技术能做什么?
Java技术将如何改变我的生活?
"Hello World!"应用程序
NetBeans IDE中的"Hello World!"
Microsoft Windows中的"Hello World!"
Solaris OS、Linux和Mac OS X中的"Hello World!"
仔细看一下"Hello World!"应用程序
问题和练习:入门
常见问题(及其解决方案)

教程: 学习Java语言

面向对象编程概念
什么是对象?
什么是类?
什么是继承?
什么是接口?
什么是包?
问题和练习:面向对象编程概念
语言基础
变量
    原始数据类型
    数组
    变量总结
    问题和练习:变量
运算符
    赋值、算术和一元运算符
    相等、关系和条件运算符
    位运算和位移运算符
    运算符总结
    问题和练习:运算符
表达式、语句和块
问题和练习:表达式、语句和块
控制流语句
    if-then和if-then-else语句
    switch语句
    while和do-while语句
    for语句
    分支语句
    控制流语句总结
    问题和练习:控制流语句
类和对象
    声明类
    声明成员变量
    定义方法
    为类提供构造函数
    向方法或构造函数传递信息
对象
    创建对象
    使用对象
更多关于类
    从方法返回值
    使用this关键字
    控制类成员的访问权限
    了解类成员
    初始化字段
    创建和使用类和对象的总结
    问题和练习:类
    问题和练习:对象
嵌套类
    内部类示例
    局部类
    匿名类
    Lambda表达式
        方法引用
    何时使用嵌套类、局部类、匿名类和Lambda表达式
    问题和练习:嵌套类
枚举类型
问题和练习:枚举类型
注解
注解基础
声明注解类型
预定义注解类型
类型注解和可插拔类型系统
重复注解
问题和练习:注解
接口和继承
接口
    定义接口
    实现接口
    使用接口作为类型
    演化接口
    默认方法
    接口摘要
    问题和练习:接口
继承
    多重继承的状态、实现和类型
    重写和隐藏方法
    多态
    隐藏字段
    使用关键字super
    Object作为超类
    编写final类和方法
    抽象方法和类
    继承摘要
    问题和练习:继承
数字和字符串
数字
    数字类
    格式化数字的打印输出
    超出基本算术
    数字总结
    问题和练习:数字
字符
字符串
    数字和字符串之间的转换
    操作字符串中的字符
    比较字符串和字符串的部分
    StringBuilder类
    字符和字符串总结
自动装箱和拆箱
问题和练习:字符和字符串
泛型(更新)
为什么使用泛型?
泛型类型
    原始类型
泛型方法
有界类型参数
    泛型方法和有界类型参数
泛型、继承和子类型
类型推断
通配符
    上界通配符
    无界通配符
    下界通配符
    通配符和子类型
    通配符捕获和辅助方法
    通配符使用指南
类型擦除
    泛型类型的擦除
    泛型方法的擦除
    类型擦除和桥接方法的影响
    非可验证类型
对泛型的限制
问题和练习:泛型
创建和使用包
    创建包
    命名包
    使用包成员
    管理源文件和类文件
    创建和使用包总结
    问题和练习:创建和使用包

教程: Java基础类

异常
什么是异常?
捕获或声明要求
捕获和处理异常
    try代码块
    catch代码块
    finally代码块
    try-with-resources语句
    总结
指定方法抛出的异常
如何抛出异常
    链式异常
    创建异常类
未检查异常 - 争议
异常的优点
总结
问题和练习
基本输入/输出
输入/输出流
    字节流
    字符流
    缓冲流
    扫描和格式化
        扫描
        格式化
    从命令行进行输入/输出
    数据流
    对象流
文件输入/输出(使用NIO.2)
    什么是路径?(以及其他文件系统信息)
    路径类
        路径操作
    文件操作
    检查文件或目录
    删除文件或目录
    复制文件或目录
    移动文件或目录
    管理元数据(文件和文件存储属性)
    读取、写入和创建文件
    随机访问文件
    创建和读取目录
    链接,符号链接或其他
    遍历文件树
    查找文件
    监视目录变化
    其他有用的方法
    旧版文件输入/输出代码
总结
问题和练习:基本输入/输出
并发
进程和线程
线程对象
    定义和启动线程
    使用Sleep暂停执行
    中断
    合并
    SimpleThreads示例
同步
    线程干扰
    内存一致性错误
    同步方法
    内部锁和同步
    原子访问
存活性
    死锁
    饥饿和活锁
保护块
不可变对象
    同步类示例
    定义不可变对象的策略
高级并发对象
    锁对象
    执行器
        执行器接口
        线程池
        Fork/Join
    并发集合
    原子变量
    并发随机数
进一步阅读
问题和练习:并发
平台环境
配置工具
    属性
    命令行参数
    环境变量
    其他配置工具
系统工具
    命令行I/O对象
    系统属性
    安全管理器
    System类中的其他方法
路径和类路径
问题和练习:平台环境
正则表达式
介绍
测试工具
字符串字面值
字符类
预定义字符类
量词
捕获组
边界匹配器
Pattern类的方法
Matcher类的方法
PatternSyntaxException类的方法
Unicode支持
附加资源
问题和练习:正则表达式

教程: 部署

Java小程序
开始使用小程序
    定义小程序子类
    里程碑方法
    小程序的生命周期
    小程序的执行环境
    开发一个小程序
    部署一个小程序
        使用小程序标签进行部署
更多小程序功能
    查找和加载数据文件
    定义和使用小程序参数
    显示短状态字符串
    在浏览器中显示文档
    从小程序调用JavaScript代码
    从JavaScript代码调用小程序方法
    使用事件处理程序处理初始化状态
    操作小程序网页的DOM
    将诊断写入标准输出和错误流
    开发可拖动小程序
    与其他小程序通信
    与服务器端应用程序交互
        网络客户端小程序示例
    小程序的能力和限制
解决常见小程序问题
问题和练习:小程序
Java Web Start
开发Java Web Start应用程序
    检索资源
部署Java Web Start应用程序
    设置Web服务器
运行Java Web Start应用程序
Java Web Start和安全性
常见的Java Web Start问题
问题和练习:Java Web Start
扩展Java富互联网应用程序
设置受信任的参数和安全属性
    系统属性
JNLP API
    使用JNLP API访问客户端
Cookies
    访问Cookies
富互联网应用程序中的安全性
保护富互联网应用程序的指南
问题和练习:扩展Java富互联网应用程序
深入部署
用户接受富互联网应用程序(RIA)
部署工具包
    部署小程序
        在Applet标签中嵌入JNLP文件
    部署Java Web Start应用程序
        更改启动按钮
        无需Codebase部署
    检查客户端JRE软件版本
Java网络启动协议
    JNLP文件的结构
部署最佳实践
    减少下载时间
    避免不必要的更新检查
    确保JRE软件的存在
    问题和练习:深入部署
部署自包含应用程序
自包含应用程序打包的先决条件
转换现有应用程序
使用文件关联
    添加外部库
    提供默认参数
    为所有平台使用通用构建文件
使用多个入口点
问题和练习:自包含应用程序
将程序打包为JAR文件
使用JAR文件:基础知识
    创建JAR文件
    查看JAR文件内容
    提取JAR文件内容
    更新JAR文件
    运行JAR打包的软件
使用清单文件:基础知识
    理解默认清单
    修改清单文件
    设置应用程序的入口点
    向JAR文件的类路径中添加类
    设置包版本信息
    封装JAR文件中的包
    使用清单属性增强安全性
签名和验证JAR文件
    理解签名和验证
    签名JAR文件
    验证已签名的JAR文件
使用与JAR相关的API
    JarClassLoader类
    JarRunner类
    问题和练习:JAR

教程: 使用Swing创建GUI

开始使用Swing
关于JFC和Swing
编译和运行Swing程序
使用NetBeans IDE学习Swing
设置CelsiusConverter项目
NetBeans IDE基础知识
创建CelsiusConverter GUI
调整CelsiusConverter GUI
添加应用逻辑
问题和练习:使用NetBeans IDE学习Swing
使用Swing组件
使用顶层容器
JComponent类
使用文本组件
    文本组件特性
    文本组件API
如何使用各种组件
    如何制作Applet
    如何使用按钮、复选框和单选按钮
    如何使用ButtonGroup组件
    如何使用颜色选择器
    如何使用组合框
    如何制作对话框
    如何使用编辑面板和文本面板
    如何使用文件选择器
    如何使用格式化文本字段
    如何制作框架(主窗口)
    如何使用内部框架
    如何使用标签
    如何使用分层面板
    如何使用列表
    如何使用菜单
    如何使用面板
    如何使用密码字段
    如何使用进度条
    如何使用根面板
    如何使用滚动面板
    如何使用分隔符
    如何使用滑块
    如何使用微调器
    如何使用分割窗格
    如何使用选项卡窗格
    如何使用表格
    如何使用文本区域
    如何使用文本字段
    如何使用工具栏
    如何使用工具提示
    如何使用树
如何在Swing组件中使用HTML
如何使用模型
如何使用图标
如何使用边框
解决常见组件问题
问题和练习:使用Swing组件
Swing中的并发
初始线程
事件分发线程
工作线程和SwingWorker
    简单的后台任务
    具有中间结果的任务
    取消后台任务
    绑定属性和状态方法
    问题和练习:Swing中的并发
使用其他Swing特性
如何与Desktop类集成
如何创建半透明和自定义形状的窗口
如何使用JLayer类装饰组件
如何使用Actions
如何使用Swing计时器
如何支持辅助技术
如何使用焦点子系统
如何使用按键绑定
如何在对话框中使用模态
如何打印表格
如何打印文本
如何创建启动画面
如何使用系统托盘
使用其他Swing特性解决常见问题
在容器中布局组件
布局管理器的可视化指南
使用布局管理器
布局管理器的工作原理
如何使用不同的布局管理器
如何使用边界布局(BorderLayout)
如何使用盒式布局(BoxLayout)
如何使用卡片布局(CardLayout)
如何使用流式布局(FlowLayout)
如何使用网格包布局(GridBagLayout)
如何使用网格布局(GridLayout)
如何使用组布局(GroupLayout)
    一个组布局的示例
如何使用弹簧布局(SpringLayout)
创建自定义布局管理器
不使用布局管理器(绝对定位)
解决常见布局问题
问题和练习:在容器中布局组件
修改外观和感觉
如何设置外观和感觉
合成外观和感觉
    一个合成外观和感觉的示例
Nimbus外观和感觉
    改变Nimbus的外观
    调整组件的大小
    改变颜色主题
拖放和数据传输
DnD简介
默认DnD支持
    演示 - BasicDnD
TransferHandler类
    导出方法
    导入方法
TransferSupport类
设置放置模式
    演示 - DropDemo
选择放置操作
    演示 - ChooseDropAction
显示放置位置
位置敏感放置
    演示 - LocationSensitiveDemo
空表格放置
放置位置渲染
顶层放置
添加剪切、复制和粘贴(CCP)
文本组件中的CCP
非文本组件中的CCP
使用和创建DataFlavor
将所有内容整合在一起 - DnD和CCP
解决常见的数据传输问题
编写事件监听器
事件监听器简介
编写事件监听器的一般信息
Swing组件支持的监听器
实现常见事件的监听器
    如何编写Action监听器
    如何编写Caret监听器
    如何编写Change监听器
    如何编写Component监听器
    如何编写Container监听器
    如何编写Document监听器
    如何编写Focus监听器
    如何编写Internal Frame监听器
    如何编写Item监听器
    如何编写Key监听器
    如何编写List Data监听器
    如何编写List Selection监听器
    如何编写Mouse监听器
    如何编写Mouse-Motion监听器
    如何编写Mouse-Wheel监听器
    如何编写Property Change监听器
    如何编写Table Model监听器
    如何编写Tree Expansion监听器
    如何编写Tree Model监听器
    如何编写Tree Selection监听器
    如何编写Tree-Will-Expand监听器
    如何编写Undoable Edit监听器
    如何编写Window监听器
监听器API表格
解决常见事件处理问题
问题和练习:编写事件监听器
执行自定义绘制
创建演示应用程序(第1步)
创建演示应用程序(第2步)
创建演示应用程序(第3步)
完善设计
深入了解绘制机制
总结
解决常见绘制问题
问题和练习:执行自定义绘制

教程: 集合框架

集合框架简介
接口
集合接口
Set接口
List接口
Queue接口
Deque接口
Map接口
对象排序
SortedSet接口
SortedMap接口
接口总结
问题与练习:接口
聚合操作
归约
并行处理
问题与练习:聚合操作
实现
Set的实现
List的实现
Map的实现
Queue的实现
Deque的实现
Wrapper的实现
Convenience的实现
实现总结
问题与练习:实现
算法
自定义集合实现
互操作性
兼容性
API设计

教程: 日期时间

日期时间概述
日期时间设计原则
日期时间包
方法命名约定
标准日历
概述
星期几和月份枚举
日期类
日期和时间类
时区和偏移类
Instant 类
解析和格式化
Temporal 包
    Temporal Adjuster
    Temporal Query
周期和持续时间
时钟
非ISO日期转换
传统日期时间代码
总结
问题和练习: 日期时间 API

教程: 国际化

介绍
快速示例
    国际化之前
    国际化之后
    运行示例程序
    国际化示例程序
检查清单
设置区域设置
创建区域设置
BCP 47扩展
识别可用区域设置
语言标签过滤和查找
区域设置的范围
区域设置敏感服务SPI
隔离区域特定数据
关于ResourceBundle类
准备使用ResourceBundle
使用Properties文件支持ResourceBundle
使用ListResourceBundle
自定义资源包加载
格式化
数字和货币
    使用预定义格式
    自定义格式
日期和时间
    使用预定义格式
    自定义格式
    更改日期格式符号
消息
    处理复合消息
    处理复数形式
处理文本
检查字符属性
比较字符串
    执行与语言环境无关的比较
    自定义排序规则
    提高排序性能
Unicode
    术语
    代理字符作为补充字符
    字符和字符串 API
    示例用法
    设计注意事项
    更多信息
检测文本边界
    关于 BreakIterator 类
    字符边界
    词边界
    句子边界
    行边界
将拉丁数字转换为其他 Unicode 数字
转换非 Unicode 文本
    字节编码和字符串
    字符和字节流
规范化文本
使用 JTextComponent 类处理双向文本
国际化网络资源
国际化域名
国际化服务提供者
将自定义资源包安装为扩展

教程: 2D 图形

Java 2D API 概念概述
坐标
Java 2D 渲染
几何基元
文本
图像
打印
开始使用图形
处理几何图形
绘制几何基元
绘制任意形状
描边和填充图形基元
使用文本 API
字体概念
文本布局概念
物理和逻辑字体
测量文本
高级文本显示
    使用渲染提示显示抗锯齿文本
    使用文本属性设置文本样式
    绘制多行文本
    处理双向文本
处理图像
读取/加载图像
绘制图像
创建并绘制图像
写入/保存图像
打印
一个基本的打印程序
使用打印设置对话框
打印多页文档
使用打印服务和属性
打印用户界面的内容
Swing 组件中的打印支持
Java2D 的高级主题
变换形状、文本和图像
裁剪绘图区域
合成图形
控制渲染质量
使用几何基元构建复杂形状
支持用户交互

教程: 声音

Sampled包概述
访问音频系统资源
播放音频
捕获音频
使用控件处理音频
使用文件和格式转换器
MIDI包概述
访问MIDI系统资源
传输和接收MIDI消息
序列器简介
使用序列器方法
使用高级序列器功能
合成声音
服务提供者接口介绍
提供采样音频服务
提供MIDI服务

教程: JavaBeans(TM)

快速入门
创建项目
按钮是一个Bean
连接应用程序
使用第三方Bean
编写JavaBeans组件
属性
方法
事件
使用BeanInfo
高级JavaBeans主题
Bean持久性
长期持久性
Bean定制

教程: JDBC数据库访问

JDBC简介
JDBC架构
关系数据库概述
JDBC基础
入门指南
使用JDBC处理SQL语句
建立连接
使用DataSource对象连接
处理SQLException
设置表
从结果集中检索和修改值
使用预编译语句
使用事务
使用RowSet对象
使用JdbcRowSet对象
使用CachedRowSet对象
使用JoinRowSet对象
使用FilteredRowSet对象
使用WebRowSet对象
使用高级数据类型
使用大对象
使用SQLXML对象
使用Array对象
使用DISTINCT数据类型
使用Structured对象
使用自定义类型映射
使用Datalink对象
使用RowId对象
使用存储过程
在GUI API中使用JDBC

教程: Java管理扩展(JMX)

JMX技术概述
为什么使用JMX技术?
JMX技术架构
监控和管理Java虚拟机
介绍MBeans
标准MBeans
MXBeans
通知
远程管理
通过JConsole公开资源以进行远程管理
创建自定义JMX客户端

教程:Java API for XML Processing (JAXP)

JAXP简介
包的概述
简单API for XML (SAX)
文档对象模型 (DOM) API
可扩展样式表语言转换 (XSLT) API
流API for XML (StAX)
查找JAXP示例程序
接下来该做什么?
简单API for XML (SAX)
何时使用SAX
使用SAX解析XML文件
实现SAX验证
处理词法事件
使用DTDHandlerEntityResolver
更多信息
文档对象模型 (DOM)
何时使用DOM
将XML数据读入DOM
使用XML模式验证
更多信息
可扩展样式表语言转换 (XSLT)
介绍XSL、XSLT和XPath
XPath的工作原理
将DOM写入XML文件
从任意数据结构生成XML
使用XSLT转换XML数据
流API for XML (StAX)
为什么使用StAX?
StAX API
使用StAX
Oracle的流式XML解析器实现
示例代码
更多信息
JAXP 1.5和新属性
背景
外部资源
新属性
范围和顺序
与SecurityManager的关系
JDK中的属性设置
使用属性
错误处理
StAX
结论
参考资料
处理限制
处理限制定义
范围和顺序
使用限制
错误处理
StAX
示例

教程: RMI

RMI应用程序概述
编写RMI服务器
    设计远程接口
    实现远程接口
创建客户端程序
编译和运行示例
    编译示例程序
    运行示例程序

教程: Java SE中的安全功能

安全功能概述
创建策略文件
设置策略文件以授予所需权限
    启动策略工具
    授予所需权限
    保存策略文件
控制应用程序的快速导览
观察应用程序自由
了解如何限制应用程序
设置策略文件以授予所需权限
    打开策略文件
    授予所需权限
    保存策略文件
查看策略文件效果
用于安全代码和文件交换的API和工具
签名代码并授予其权限
代码签名者的步骤
    下载并尝试示例应用程序
    创建包含类文件的JAR文件
    生成密钥
    签署JAR文件
    导出公钥证书
代码接收者的步骤
    观察受限应用程序
    导入证书作为受信任的证书
    设置策略文件以授予所需权限
        启动策略工具
        指定密钥库
        添加具有SignedBy别名的策略条目
        保存策略文件
    查看策略文件效果
文件交换
合同发送者的步骤
    创建包含合同的JAR文件
    生成密钥
    对JAR文件进行签名
    导出公钥证书
合同接收者的步骤
    将证书导入为受信任的证书
    验证JAR文件的签名
生成和验证数字签名
生成数字签名
    准备初始程序结构
    生成公钥和私钥
    对数据进行签名
    将签名和公钥保存到文件中
    编译和运行程序
验证数字签名
    准备初始程序结构
    输入并转换编码的公钥字节
    输入签名字节
    验证签名
    编译和运行程序
弱点和替代方案
实现自己的权限
ExampleGame
高分类
高分权限类
示例策略文件
将所有内容组合在一起
    高分开发者(Chris)的步骤
    ExampleGame开发者(Terry)的步骤
    运行ExampleGame的用户(Kim)的步骤

教程: 扩展机制

创建和使用扩展
已安装的扩展
下载扩展
了解扩展类加载
创建可扩展的应用程序
使扩展安全
为扩展设置权限
封装扩展中的包

教程: 反射API

获取类对象
检查类修饰符和类型
查找类成员
故障排除
成员
字段
    获取字段类型
    获取和解析字段修饰符
    获取和设置字段值
    故障排除
方法
    获取方法类型信息
    获取方法参数名称
    获取和解析方法修饰符
    调用方法
    故障排除
构造函数
    查找构造函数
    获取和解析构造函数修饰符
    创建新的类实例
    故障排除
数组和枚举类型
数组
    识别数组类型
    创建新的数组
    获取和设置数组及其组件
    故障排除
枚举类型
    检查枚举
    获取和设置带有枚举类型的字段
    故障排除

教程: 自定义网络

网络概述
你可能已经了解的Java网络知识
网络基础知识
使用URL
什么是URL?
创建URL
解析URL
直接从URL读取
连接到URL
从URLConnection读取和写入
关于Socket的一切
什么是Socket?
从Socket读取和写入
编写Socket服务器端
关于Datagram的一切
什么是Datagram?
编写Datagram客户端和服务器端
向多个接收者广播
编程访问网络参数
什么是网络接口?
检索网络接口
列出网络接口地址
网络接口参数
处理Cookie
使用Cookie进行HTTP状态管理
CookieHandler回调机制
默认CookieManager
自定义CookieManager

导航: 附加内容

泛型
介绍
定义简单泛型
泛型和子类型
通配符
泛型方法
与遗留代码互操作
细节
类字面值作为运行时类型标记
更多通配符的应用
将遗留代码转换为使用泛型
致谢
全屏独占模式 API
全屏独占模式
显示模式
被动渲染 vs 主动渲染
双缓冲和页面翻转
BufferStrategy 和 BufferCapabilities
示例
为 Java 程序员语言认证做准备

教程: Java命名和目录接口

命名和目录概念
目录概念
JNDI概述
命名包
目录和LDAP包
事件和服务提供者包
软件设置
LDAP设置
Java应用程序设置
命名和目录操作
命名异常
查找对象
列出上下文
添加、替换或删除绑定
重命名
创建和销毁子上下文
属性名称
读取属性
修改属性
使用属性添加、替换绑定
搜索
    基本搜索
    过滤器
    范围
    结果计数
    时间限制
故障排除技巧
LDAP用户的高级主题
LDAP v3
JNDI作为LDAP API
    LDAP操作如何映射到JNDI API
    LDAP错误代码如何映射到JNDI异常
安全性
    LDAP身份验证模式
    身份验证机制
    匿名
    简单
    SASL
    Digest-MD5
    SSL和自定义套接字
更多LDAP操作
    LDAP比较
    搜索结果
    LDAP非请求通知
连接管理
    创建
    关闭
    连接池
    配置
常见问题
目录中的Java对象
存储和读取对象
可序列化对象
JDK 5.0和JDK 6中的新功能
检索专有名称
标准LDAP控件
分页结果控件
排序控件
管理转发控件
操作LdapName(专有名称)
操作相对专有名称(RDN)
设置Ldap操作的超时时间

教程: Sockets Direct Protocol

理解Sockets Direct Protocol
概述
创建SDP配置文件
启用SDP协议
调试SDP
SDP的技术问题
Solaris和Linux支持
支持的Java API
更多信息

教程: Java XML绑定

JAXB简介
JAXB架构
表示XML内容
绑定XML模式
自定义生成的类和Java程序元素
JAXB示例
基本示例
自定义JAXB绑定
Java到模式的示例
更多信息