Java密封类进阶指南:5分钟搞懂非密封子类的核心价值

第一章:Java密封类与非密封子类概述

Java 密封类(Sealed Classes)是 Java 17 引入的一项重要语言特性,旨在增强类继承的可控性。通过密封类,开发者可以明确指定哪些类可以作为其子类,从而限制继承层次结构的扩展,提升代码的安全性和可维护性。

密封类的基本概念

密封类使用 sealed 修饰符声明,并通过 permits 关键字列出允许继承它的类。这些被允许的子类必须位于同一模块中,并且每个子类都必须使用特定的修饰符:可以是 final、sealed 或 non-sealed。
  • final:表示该子类不可再被继承
  • sealed:表示该子类本身也是密封类,继续限制其子类
  • non-sealed:表示该子类开放继承,任何类都可以继承它

非密封子类的作用

当一个密封类的子类被声明为 non-sealed,意味着继承链在此处“开放”,允许任意数量的后续实现类。这在设计框架时尤为有用,既保证了核心类型的封闭性,又保留了必要的扩展能力。 例如,以下代码展示了一个密封类及其非密封子类的定义:

public sealed abstract class Shape permits Circle, Rectangle, CustomShape { }

final class Circle extends Shape { }

final class Rectangle extends Shape { }

non-sealed class CustomShape extends Shape { } // 允许其他类继承 CustomShape
在上述示例中,CustomShape 被声明为 non-sealed,因此其他类可以合法地继承它,而 Circle 和 Rectangle 则不可再被继承。

密封类的适用场景

场景说明
领域模型建模精确控制业务实体的类型层次
API 设计防止外部不受控的实现类破坏契约
模式匹配增强配合 switch 表达式实现穷尽性检查

第二章:密封类基础与非密封子类语法解析

2.1 密封类的定义与permits关键字详解

密封类(Sealed Classes)是Java 17引入的重要特性,用于限制类的继承结构。通过sealed修饰的类,可明确指定哪些子类可以继承它,增强封装性与安全性。
permits关键字的作用
permits关键字用于显式声明允许继承密封类的具体子类。若未显式列出,编译器将自动推导直接子类。
public sealed class Shape permits Circle, Rectangle, Triangle {
    public abstract double area();
}
上述代码中,Shape为密封类,仅允许Circle、Rectangle和Triangle继承。每个允许的子类必须使用final、sealed或non-sealed之一进行修饰。
  • final:表示该类不可再被继承
  • sealed:继续限制其子类范围
  • non-sealed:开放继承,任何类均可扩展它

2.2 非密封子类的声明方式与限制条件

在面向对象设计中,非密封子类指未被显式声明为不可继承的类,允许其他类对其进行扩展。此类声明需遵循特定语法规范与继承约束。
声明语法结构

public class DerivedClass extends BaseClass {
    // 子类成员定义
}
上述代码展示了 Java 中非密封子类的标准声明方式。extends 关键字表明继承关系,基类未使用 final 修饰,表示允许派生。
继承限制条件
  • 父类构造器必须可访问(即非私有)
  • 子类不能重写父类的 final 方法
  • 访问控制需符合封装原则,如 protected 成员可在子类中访问
这些规则确保了继承体系的稳定性与安全性。

2.3 sealed、non-sealed与final关键字的协同使用

在Java等面向对象语言中,`sealed`类用于限制继承体系,明确指定哪些子类可以扩展它。通过结合`non-sealed`和`final`关键字,可精细化控制类的继承策略。
继承权限的精确控制
`sealed`类必须显式列出允许继承的子类,这些子类需使用`permits`声明。子类可通过`non-sealed`取消限制,允许进一步扩展;而`final`则彻底禁止派生。

public sealed abstract class Shape permits Circle, Rectangle, Triangle { }
public final class Circle extends Shape { } // 不可再继承
public non-sealed class Rectangle extends Shape { } // 允许后续继承
public class Square extends Rectangle { } // 合法:Rectangle为non-sealed
上述代码中,`Shape`仅允许三个子类。`Circle`为`final`,阻止继承;`Rectangle`标记为`non-sealed`,使`Square`能合法继承。
设计优势对比
  • sealed:增强模式匹配安全性,限定类型闭包
  • non-sealed:保留扩展灵活性
  • final:防止意外或恶意继承

2.4 编译时验证机制与继承结构合规性分析

在静态类型语言中,编译时验证是保障继承结构合规性的核心机制。编译器通过类型检查确保子类正确覆写父类方法,并满足接口契约。
类型安全与方法覆写
编译器会校验方法签名一致性,防止运行时类型错误。例如,在 Go 中通过接口隐式实现进行结构化约束:
type Reader interface {
    Read(p []byte) (n int, err error)
}

type FileReader struct{}

func (f FileReader) Read(p []byte) (int, error) {
    // 实现读取逻辑
    return len(p), nil
}
上述代码中,FileReader 自动实现 Reader 接口,编译器在编译阶段完成兼容性验证,确保结构符合预期契约。
继承层级的静态分析
现代编译器结合抽象语法树(AST)对继承链进行遍历分析,检测菱形继承、非法覆写等问题,提升代码可靠性。

2.5 常见语法错误与编译器提示解读

在Go语言开发中,理解编译器提示是提升调试效率的关键。常见的语法错误包括拼写错误、括号不匹配和类型不一致。
典型编译错误示例

package main

func main() {
    fmt.Println("Hello, World") // 错误:未导入fmt包
}
上述代码将触发undefined: fmt错误。编译器明确指出标识符未定义,说明缺少import "fmt"语句。这是典型的“使用前未声明”错误。
常见错误分类与响应
  • 未定义标识符:检查包导入与变量声明
  • 类型不匹配:确认函数参数与返回值类型一致性
  • 语法结构缺失:如缺少分号、括号或大括号闭合
编译器输出通常包含文件名、行号及错误描述,精准定位问题源头,帮助开发者快速修复。

第三章:非密封子类的设计动机与核心价值

3.1 打破封闭继承链:扩展性的关键突破口

在传统面向对象设计中,继承机制常导致类层级僵化,形成封闭的继承链,严重制约系统的可扩展性。通过引入组合与接口抽象,可以有效打破这一瓶颈。
组合优于继承
使用组合替代深度继承,能够动态构建行为,提升灵活性。例如,在 Go 语言中:

type Logger interface {
    Log(message string)
}

type UserService struct {
    logger Logger // 组合日志能力
}

func (s *UserService) CreateUser(name string) {
    s.logger.Log("Creating user: " + name)
}
上述代码中,UserService 通过注入 Logger 接口实现解耦,无需依赖具体继承结构,便于替换和扩展日志实现。
开放-封闭原则的实践
系统应对扩展开放,对修改关闭。通过接口定义契约,结合依赖注入,使新增功能无需改动已有逻辑,显著提升维护性与模块化程度。

3.2 在可控范围内开放继承的工程意义

在大型软件系统中,继承机制若不加约束易导致类层级膨胀与维护困难。通过限制继承的使用范围,可兼顾代码复用与系统稳定性。
设计原则与实现策略
采用“允许继承但限制重写”的方式,常见于框架设计中。例如,在 Go 语言中可通过接口与组合模拟受控继承:

type BaseService struct {
    logger *Logger
}

func (s *BaseService) Log(msg string) {
    s.logger.Print(msg)
}

// 受保护方法:不提供虚函数机制,子类无法“重写”
func (s *BaseService) Process(data string) {
    s.Log("start")
    s.processImpl(data) // 实际逻辑交由实现类型
    s.Log("end")
}

// 子类型通过组合扩展
type UserService struct {
    BaseService
}

func (u *UserService) processImpl(data string) {
    // 具体业务逻辑
}
上述代码通过将核心流程固化在基类中,仅开放特定钩子方法(如 processImpl)供子类实现,从而实现继承的“可控开放”。
优势分析
  • 提升代码一致性:关键流程不可变,避免误覆盖
  • 降低耦合度:通过组合与钩子模式替代深度继承树
  • 增强可测试性:基类行为稳定,便于单元测试隔离

3.3 非密封子类在领域模型演化中的实践优势

在领域驱动设计中,非密封子类为模型的可扩展性提供了天然支持。通过允许子类继承并扩展父类行为,系统可在不修改原有代码的前提下引入新功能。
灵活应对业务变化
当核心领域逻辑需要适应新业务规则时,非密封类可通过派生子类实现差异化行为。例如:

public abstract class Order {
    public abstract BigDecimal calculateDiscount();
}

public class RegularOrder extends Order {
    public BigDecimal calculateDiscount() {
        return BigDecimal.ZERO;
    }
}

public class VIPOrder extends Order {
    public BigDecimal calculateDiscount() {
        return new BigDecimal("0.2");
    }
}
上述代码中,Order 作为非密封基类,允许未来新增 CorporateOrder 等子类而无需重构现有逻辑。各子类独立封装特定折扣策略,符合开闭原则。
支持渐进式模型演进
  • 新业务场景可通过继承快速建模
  • 旧实现保持稳定,降低回归风险
  • 多态机制确保调用一致性

第四章:典型应用场景与代码实战

4.1 构建可扩展的领域分层架构

在现代软件系统中,清晰的分层架构是实现高内聚、低耦合的关键。通过将业务逻辑划分为表现层、应用层、领域层和基础设施层,能够有效提升系统的可维护性与可测试性。
分层职责划分
  • 表现层:处理用户交互,如HTTP请求解析;
  • 应用层:协调领域对象完成业务用例;
  • 领域层:核心业务规则与实体模型;
  • 基础设施层:提供数据库、消息队列等技术支撑。
领域实体示例

type Order struct {
    ID        string
    Status    string
    CreatedAt time.Time

    // 业务行为封装
    func (o *Order) Cancel() error {
        if o.Status == "shipped" {
            return errors.New("已发货订单不可取消")
        }
        o.Status = "cancelled"
        return nil
    }
}
上述代码展示了领域模型对状态变更逻辑的封装,避免业务规则散落在各层中,增强可读性和一致性。

4.2 框架设计中预留扩展点的实现策略

在框架设计中,扩展点的合理预留是提升系统可维护性与灵活性的关键。通过接口抽象和依赖注入机制,能够有效解耦核心逻辑与业务实现。
使用接口定义扩展契约
通过定义清晰的接口,明确扩展行为的调用规范:

type DataProcessor interface {
    Process(data []byte) ([]byte, error)
}
该接口为数据处理模块提供统一契约,任何符合该签名的实现均可插拔替换,无需修改调用方代码。
注册机制实现动态扩展
采用注册表模式集中管理扩展实现:
  • 通过全局 map 存储类型标识到实例的映射
  • 运行时根据配置动态加载对应处理器
  • 支持第三方模块通过 Register 函数注入新实现
扩展点配置示例
扩展类型实现名称启用状态
validatorjson-validatortrue
processorgzip-compressorfalse

4.3 结合模式匹配提升运行时处理灵活性

在现代编程语言中,模式匹配为运行时数据结构的解析提供了声明式且高效的手段。通过将值与预定义结构进行匹配,程序可动态选择执行路径,显著增强逻辑表达能力。
模式匹配基础语法
以 Go 语言扩展特性为例,模拟模式匹配行为:

switch v := value.(type) {
case int:
    fmt.Println("整数类型:", v)
case string:
    fmt.Println("字符串类型:", v)
case nil:
    fmt.Println("空值")
default:
    fmt.Println("未知类型")
}
该代码通过类型断言实现运行时类型匹配,v := value.(type) 提取变量实际类型,每个 case 分支对应不同处理逻辑,提升代码可读性与扩展性。
应用场景对比
场景传统条件判断模式匹配方案
JSON解析嵌套if-else结构解构+匹配
事件路由多重switch标签联合匹配

4.4 单元测试中对非密封子类的模拟与验证

在面向对象设计中,非密封类(non-sealed class)允许任意扩展,这为单元测试中的行为模拟带来挑战。为有效验证其子类行为,常借助 mocking 框架控制依赖。
使用 Mockito 模拟子类行为

@Test
void shouldReturnMockedValue_whenCallingOverriddenMethod() {
    // 给定:一个非密封类的子类被模拟
    NonSealedParent mock = mock(ConcreteSubclass.class);
    when(mock.calculate()).thenReturn(42);

    // 当:调用被重写的方法
    int result = mock.calculate();

    // 验证:返回值符合预期
    verify(mock).calculate();
    assertEquals(42, result);
}
上述代码通过 Mockito 创建具体子类的实例代理,拦截 calculate() 方法调用并注入预设返回值。这使得测试可独立于实际实现逻辑运行。
常见模拟策略对比
策略适用场景优点
部分模拟 (spy)保留部分真实行为减少伪造程度
完全模拟 (mock)彻底隔离外部依赖控制力强

第五章:总结与未来演进方向

云原生架构的持续深化
现代企业正加速向云原生转型,Kubernetes 已成为容器编排的事实标准。例如,某金融企业在其核心交易系统中引入 Service Mesh 架构,通过 Istio 实现细粒度流量控制和零信任安全策略:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: trading-service-route
spec:
  hosts:
    - trading-service
  http:
    - route:
        - destination:
            host: trading-service
            subset: v1
          weight: 90
        - destination:
            host: trading-service
            subset: v2
          weight: 10
该配置支持灰度发布,显著降低上线风险。
AI 驱动的运维智能化
AIOps 正在重塑运维模式。某电商平台利用机器学习模型对历史日志进行训练,实现异常检测自动化。以下为关键组件部署清单:
  • 日志采集层:Fluentd + Filebeat
  • 数据处理引擎:Apache Flink 实时流处理
  • 模型服务:TensorFlow Serving 部署预测模型
  • 告警系统:集成 Prometheus 与 Alertmanager
模型上线后,故障平均发现时间从 15 分钟缩短至 48 秒。
边缘计算与分布式系统的融合
随着 IoT 设备激增,边缘节点管理复杂度上升。某智能制造项目采用 K3s 构建轻量级集群,在 200+ 工厂站点实现统一调度。下表展示了边缘与中心云资源分配对比:
维度边缘节点中心云
平均延迟8ms86ms
带宽消耗低(本地处理)高
更新频率周级小时级
dxf-viewer 查看器 dxf-viewer SDK 的示例,它是一个基于 Three.js 和 Vue3 构建的基于 WebGL 的 BIM 模型查看器。它用于查看 DWG/DXF/PDF 文件。面积测量 - 角度测量 -标记。 阅读详情

相关推荐

一文告诉你:如何在trae中编译运行GD32程序,并让AI帮你修改代码

本文详细介绍了如何将GD32程序如何用官方固件库构建出来,然后从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 2661

密封类设计难题,Java 17中non-sealed实现的3个致命约束

掌握Java 17密封类设计难题的破解之道,深入解析非密封实现的三大约束及其适用场景与继承规则。明确限定扩展边界,提升类型安全性,同时保留必要灵活性。全面剖析Java 17密封类的非密封实现限制,值得收藏。

CompiWander的博客 262

Windows Pychram部署Unet++过程

windows系统 在pycharm平台上配置并跑通Unet网络 这里我用的是B站课程里的资源《唐宇迪Unet图像分割语义分割实战》

ArcGis_Niu的博客 803

Java 17 新特性:密封类

Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360、JDK 16中的JEP 397),最终定稿于JDK 17中的JEP 409。Sealed Classes有两种主流翻译:密封类、封闭类。个人喜欢前者多一些,所以在本文中都称为密封类。其实Sealed Classes的其他许多语言中并不是什么新鲜事物,C#、Scala等高级语言中都有类似的名称,但意义和作用各不相同。下面就来一起认识一下Java 17中的Sealed Classes。 密封类的

Trouvailless的博客 476

忍者安全渗透系统(NINJITSU OS V3)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

忍者安全渗透系统(NINJITSU)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

1万+

论文阅读笔记(一)细粒度图像检索

0、参考文献 [1]见微知著 http://geek.youkuaiyun.com/news/detail/191718 [2]Xiu-Shen Wei 《Selective Convolutional Descriptor Aggregation for Fine-Grained Image Retrieval》 [3]Lingxi Xie 《Fine-Grained Image Search》 1...

huang2818138的博客 1万+

面试官问:JDK 17/21核心新特性(虚拟线程/Record/密封类)?一张图+办公流程比喻,彻底拿下这道必考题(附图解+比喻+避坑指南)

摘要:JDK 17和21是Java最新的两个LTS版本,标志着Java从“企业级稳重”走向“现代化高效”。JDK 17带来Record类(告别POJO样板代码)、密封类(精准控制继承边界)、模式匹配(简化类型判断与解构);JDK 21带来虚拟线程(百万级并发,彻底改变高并发编程范式)、结构化并发(子任务生命周期自动管理)、顺序集合(统一有序集合操作)。一句话:JDK 17让代码更简洁安全,JDK 21让并发更轻量强大。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 364

TMP112/TMP102温度传感器驱动开发与嵌入式实战

数字温度传感器是嵌入式系统环境感知的核心器件,其通过I²C等标准总线实现高精度、低功耗测温。原理上依赖ΔΣ模数转换与二进制补码数据格式,结合寄存器配置实现模式控制、阈值报警与功耗管理。技术价值体现在±0.5°C级精度、1μA级静态电流及SOT-563超小封装带来的系统集成优势。广泛应用于工业MCU热监控、电池物联网终端、医疗电子温度补偿及汽车ECU板级测温等场景。本文围绕TMP112/TMP102展开,深入解析寄存器协议、硬件接口约束、HAL驱动分层设计、FreeRTOS任务调度及生产级校准方法,覆盖从芯片

weixin_35756690的博客 674

如何快速掌握Vineflower:Java反编译的终极指南

Vineflower是一款现代化的Java & JVM语言反编译器,专注于提供最高质量的反编译结果,支持Java 21+的新特性,包括记录类、密封类、开关表达式和模式匹配等。作为Fernflower反编译器的分支,Vineflower以其精准的代码还原能力和出色的性能表现,成为开发者分析Java字节码的首选工具。无论是学习开源项目、分析第三方库,还是调试自己的代码,Vineflower都能提供高质

gitblog_00038的博客 1025

Windows 下 Claude Code Desktop 安装与使用全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Claude Code 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Claude Code 的同学们有所帮助。 文章目录 1. 背景 2. 安装Claude Code Desktop 3. 配置第三方API 4. 日常使用

weixin_43178406的博客 8万+

飞牛 NAS 部署 Hermes Agent 全指南:打造 24 小时在线、自我进化的 AI 智能体!

当大多数人还在把 AI 当聊天机器人使用时,我已经把它部署到了家里的飞牛 NAS 上,让它 24 小时在线工作、记忆我的习惯、自动执行任务,甚至还能不断学习新的技能。今天带你从零搭建这个真正属于自己的 AI Agent。🚀

XiaoqiangClub的博客 1227

5分钟掌握CFR:Java反编译终极实战指南

你是否曾面对只有class文件的Java代码束手无策?CFR就是你的救星!作为业界领先的Java反编译工具,CFR能将编译后的字节码精准还原为可读的Java源代码。无论你是想审计第三方库的安全性、理解遗留系统逻辑,还是学习优秀开源项目的实现,CFR都能帮你轻松搞定。😊 ## 📦 快速上手:从零开始使用CFR ### 获取CFR的三种方式 想要开始使用CFR,你有多个选择: 1. **直接

gitblog_00396的博客 200

微信小程序 - 最新详细实现用户保存下载视频到手机相册,将视频临时路径、在线播放地址(网络路径)URL存储到手机,弹出访问手机相册权限询问,支持视频格式mp4、avi、mov、wmv、flv、webm

微信小程序,视频,手机相册,保存,另存为,小程序保存到相册权限,writePhotosAlbum,一键保存视频到手机相册功能(视频来源为链接),第一次要获取用户授权,授权使用相册权限,小程序视频下载,如何把视频下载到相册,下载一个视频到本地相册,显示下载进度,可取消下载,视频下载到本地,微信小程序视频如何下载,保存视频到相机,页面播放视频并下载到本地,安卓系统,苹果ios保存到相册报错,权限拒绝后打不开,添加相册授权弹框拒绝后再也出不来了,实现保存视频到手机相册功能,将mp4在线视频下载并存储到用户的手机中

🏆 前端领域优质创作者 7623

JDK 17核心特性实战:从语法到性能的全面升级指南

Java作为企业级应用开发的主流语言,其运行时环境JVM的垃圾回收机制和类型系统设计一直是影响系统性能与代码质量的核心要素。理解垃圾回收器的工作原理,如ZGC如何通过并发标记和染色指针技术实现亚毫秒级停顿,是优化高并发服务响应时间的关键。同时,现代编程语言通过增强类型系统来提升代码的安全性与表达力,例如记录类通过不可变数据和自动生成方法简化了数据传输对象的设计,密封类则通过限制继承关系实现了更严谨的领域建模。这些底层原理和技术价值最终服务于微服务、云原生等实际应用场景,帮助开发者构建更高效、更稳定的分布式系

weixin_30591551的博客 352

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java 8到Java 17与Spring Boot升级:实战评估、分步迁移与性能优化全指南

Java作为企业级应用开发的核心语言,其版本演进不仅带来了新的语法特性,更在JVM层面实现了性能与安全性的持续优化。从Java 8到Java 17的升级,涉及模块化系统、新的垃圾收集器(如ZGC)以及Records、密封类等现代语言特性,这些改进旨在提升应用运行效率、降低内存开销并增强代码的可维护性。对于广泛采用Spring Boot框架的微服务或单体应用而言,结合Spring Boot 2.7/3.0+的升级,能够原生适配新JDK,解锁更高的开发与运维效能。本文聚焦于**依赖冲突**排查与**性能基准测试

weixin_34128839的博客 336

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

从安装到实战:用快马生成一个展示jdk17新特性的可部署spring boot示例项目

项目的pom.xml需要特别注意两点:一是指定JDK17的编译版本,二是确保Spring Boot版本兼容JDK17。平台自动生成的配置已经处理好了这些细节,还包含了必要的web和lombok依赖。写完代码后直接点击了平台的部署按钮,不到1分钟就生成了可访问的在线地址。最近在升级JDK17时,发现官方文档里提到的新特性看着很酷,但光看概念总觉得差点意思。每个子类都实现了计算面积的方法,其中圆形需要半径参数,矩形需要长宽参数。创建新项目时,直接勾选了Spring Boot模板,省去了手动配置的麻烦。

EmeraldWolf23的博客 27

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

2026年Java面试八股文核心解析与实战指南

Java面试八股文是技术面试中高频出现的核心知识点集合,其本质是对Java技术栈体系化理解的考察。从JVM内存模型到并发编程原理,这些基础概念构成了分布式系统设计的底层支撑。随着云原生技术的普及,现代Java面试更注重考察候选人在微服务、ServiceMesh等场景下的实战能力。优质的八股文资料应包含问题树知识框架和真实故障案例,帮助开发者掌握从Java基础到分布式架构的全栈技能。最新版本特别强化了GraalVM优化、ZGC调优等前沿内容,并采用3-2-1训练法等科学备考策略,是应对大厂技术面试的有效工具。

weixin_32050773的博客 277

Java面试核心技术解析:HashMap、JVM与分布式系统设计

HashMap作为Java集合框架的核心组件,其底层采用数组+链表/红黑树结构实现,通过负载因子控制扩容阈值以平衡空间与时间效率。JVM内存模型则涉及堆、栈、方法区等区域的协同工作,JDK8后元空间取代永久代优化了内存管理。在分布式系统设计中,Redis分布式锁需结合原子操作与续期机制保障可靠性,而B+树索引通过减少磁盘IO提升MySQL查询性能。掌握这些基础原理对应对大厂技术面试至关重要,尤其在处理高并发场景和系统优化时,深入理解数据结构与算法设计能显著提升解决方案的质量。

weixin_30706691的博客 351

Spring AI 实战:Java 开发者 5 分钟接入大模型

大模型应用开发通常涉及提示词编排、上下文管理与模型调用等基础能力。其核心原理是通过统一接口封装不同厂商的模型服务,降低技术栈切换成本。Spring AI 基于 Spring Boot 自动配置机制,将模型调用、会话记忆与流式输出内化为标准 Bean,让 Java 开发者无需引入 Python 服务即可完成 AI 能力集成。在智能客服、知识库问答、企业级对话系统等场景中,这种方案能显著减少胶水代码与运维复杂度。对于习惯 Spring 生态的团队而言,使用 ChatClient 与 ChatMemory 即可快

weixin_42520661的博客 97

怎样高效反编译Java字节码:Vineflower的3个实战技巧深度解析

Vineflower是一款专注于提供最高质量Java字节码反编译的现代化工具,作为Fernflower反编译器的分支,它支持Java 21+的最新特性,包括记录类、密封类、开关表达式和模式匹配等。想象一下,当你面对一个只有.class文件的第三方库,需要理解其内部实现逻辑时,Vineflower能够将字节码精准还原为可读性极高的Java源代码,为你揭开黑盒的神秘面纱。 ## 🎯 场景化应用:从

gitblog_00158的博客 369

Qwen3.5-397B-A17B 深度解析与部署实战:多模态 MoE 混合架构、OpenAI 兼容推理与百万级超长上下文指南

> 本文以开源仓库 [README.md](https://link.gitcode.com/i/4432819e07e6682ad06e1629b964d751) 为主线,结合 [config.json](https://link.gitcode.com/i/72ce02cd17fd0743987939ac842100c2)、[generation_config.json](https://li

gitblog_01040的博客 254

游戏后端Java笔试复盘:非游戏基础题考点全解析

Java基础是技术面试的基石,尤其在游戏后端开发岗位中,集合框架、并发编程和JVM内存模型等核心知识直接决定候选人能否胜任高并发、低延迟的服务器开发。游戏公司的Java岗并非只写客户端逻辑,大量登录服、战斗服、排行榜等系统都依赖扎实的Java功底。HashMap的扩容机制、synchronized与ReentrantLock的区别、可达性分析与GC Roots,这些看似常规的Java面试题,在游戏后端笔试中往往是筛选人才的关键。从基础语法到集合线程安全,从JVM调优到网络IO模型,系统梳理这些高频考点,能帮

weixin_34178244的博客 372

VisualVM实战指南:JDK自带Java诊断工具的正确用法

VisualVM是JDK原生集成的Java运行时诊断工具,基于JVM Attach API实现无侵入监控,原理上整合线程分析、堆内存可视化、GC行为追踪与JMX管理四大能力。其技术价值在于零部署成本、全版本兼容性(JDK 8–21)及生产环境友好性——尤其适用于禁止第三方Agent的金融政企场景。典型应用场景包括CPU热点定位、内存泄漏初筛、线程死锁检测及Spring Boot Actuator指标验证。本文聚焦JDK 17+环境下VisualVM的安装避坑、中文界面正确配置、Visual GC与Threa

weixin_33871366的博客 480

Spring 5:Java响应式编程与协议无关架构的奠基之作

响应式编程正成为高并发Java后端的核心范式,其本质是用数据流(Flux/Mono)替代传统阻塞式请求-响应模型,依托Reactor实现单线程高吞吐。Spring 5首次将响应式内核深度融入框架主干,通过WebFlux、函数式路由、协议无关容器设计,解耦业务逻辑与传输协议,使同一Bean可无缝运行于Servlet或Netty环境。该架构显著提升I/O密集型场景(如实时推送、设备接入、多源API编排)的资源利用率与伸缩性,并为Kotlin协程、R2DBC、Spring AI等现代技术栈提供统一的非阻塞底座。本

weixin_30905981的博客 385

如何在DS2API中实现中英双语国际化:i18n完整方案指南

DS2API 是一款 DeepSeek 兼容的 API 中间件,它将多种 Web 协议转换为标准化格式,并内置了可视化管理面板。这套管理面板原生支持**中英双语国际化(i18n)**:语言自动检测、一键切换、偏好持久化,整套方案仅用一个轻量 Context + 两份 JSON 词表实现,不依赖任何第三方翻译库。本文将带你快速看懂它的完整实现思路,以及如何轻松扩展新语言。 ## 整体架构:零依赖的

gitblog_00430的博客 471

2026年Java开发者AI编程实战指南:从工具选型到合规落地

AI编程已从代码补全辅助升级为嵌入CI/CD与架构决策的新型开发操作系统。其核心原理在于上下文感知、PR驱动生成、字节码级逆向理解及多语言语义对齐,技术价值体现在显著降低SonarQube阻断级问题(降幅超90%)、压缩Code Review耗时(42分钟→8分钟)并保障遗留系统与信创环境适配。典型应用场景覆盖Spring Boot微服务重构、JDK/框架版本碎片化治理、无文档jar包逆向文档化,以及Java/Python/Go混合项目的一致性保障。本文聚焦Java生态真实生产约束,直击时效性、可控性与可审

weixin_33717117的博客 366
上一篇: Java 22虚拟线程ThreadFactory实战指南(从入门到生产级应用)
下一篇: Java反射绕过安全检查的代价:3个真实线上事故案例警示
SimSolve
博客等级 码龄1年 152粉丝 2009原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值