23. 【Java】内部类与静态嵌套类

【Zephyr 系列 29】低功耗调试指南:电流测量、系统睡眠与功耗分析 Zephyr低功耗调试指南(150字摘要) 针对物联网设备续航需求,本文解析Zephyr低功耗调试方法:1️⃣ 机制:启用PM子系统和tickless idle,配置睡眠策略;2️⃣ 测量:推荐功耗分析仪捕捉μA级电流波动;3️⃣ 优化:管理唤醒源(如GPIO/RTC)、调整BLE广播/连接参数,挂起闲置外设;4️⃣ 分析:建立功耗文档,对比不同模式电流(如待机0.6mA vs广播3.2mA)。强调低功耗需系统性设计,初期即需纳入测试流程。下期将探讨Zephyr OTA升级实现。 阅读详情

摘要: 本文深入解析Java内部类的四种类型:成员内部类、静态嵌套类、局部内部类和匿名内部类。通过生动的比喻和实际代码示例,详细讲解每种内部类的定义方式、访问权限、使用场景及优缺点。文章还提供了学生管理系统的综合示例,展示内部类在实际项目中的应用,并探讨内部类与设计模式的关系,帮助开发者更好地理解和使用这一重要的Java特性。

关键词: Java内部类, 成员内部类, 静态嵌套类, 匿名内部类, 设计模式


在之前的文章中,我们一直把类看成是独立的“单元”,每个类单独存放在一个 .java 文件中。

但现实中的类有时候并不需要独立存在——有些类的作用域非常“狭窄”,它们只服务于一个特定的外部类,就像公寓里的住客一样,和公寓本身紧密关联。

比如,你正在实现一个“链表”数据结构。链表的每个节点,实际上只对链表本身有意义,它不需要在程序的其他地方单独使用。如果把这个 Node 类单独放到一个文件中,不仅增加了文件数量,还容易造成命名冲突和滥用。

Java 允许你将一个类定义在另一个类的内部,这就是 内部类(Inner Class)。内部类可以访问外部类的所有成员(包括私有成员),非常适合用来实现那些“依附于外部类”的辅助组件。

今天,我们就来全面认识四种内部类:

  1. 成员内部类(非静态内部类)
  2. 静态嵌套类(静态内部类)
  3. 局部内部类
  4. 匿名内部类

我们逐一来看。


1. 成员内部类 —— 外部类的“核心伙伴”

成员内部类是最常见的内部类。它定义在外部类的内部,不加 static 修饰,像一个普通成员变量或方法一样存在于外部类中。

public class Outer {
    private String message = "Hello from Outer";

    // 成员内部类
    public class Inner {
        public void printMessage() {
            // 可以直接访问外部类的私有成员
            System.out.println(message);
        }
    }
}

要创建成员内部类的对象,你必须先有外部类的实例,然后通过外部类的实例来创建内部类对象:

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();   // 注意语法
inner.printMessage();   // 输出:Hello from Outer

也可以在外部类内部直接创建:

public class Outer {
    private String message = "Hello";

    public void createInner() {
        Inner inner = new Inner();   // 在外部类内部可以直接 new
        inner.printMessage();
    }

    public class Inner {
        public void printMessage() {
            System.out.println(message);
        }
    }
}

成员内部类的特点:

  • 它可以访问外部类的所有成员(包括 private 成员)。
  • 它不能定义静态成员(因为内部类本身依赖于外部类的实例)。
  • 它对外部类有一个隐式的引用(通过 Outer.this 可以访问外部类的当前实例)。
Outer.this 与 this

当内部类和外部类的成员重名时,可以使用 Outer.this 明确访问外部类的成员:

public class Outer {
    private String name = "Outer";

    public class Inner {
        private String name = "Inner";

        public void printNames() {
            System.out.println("外部类 name:" + Outer.this.name);
            System.out.println("内部类 name:" + this.name);
        }
    }
}

2. 静态嵌套类 —— 不依赖外部类实例的“住客”

如果你在内部类的定义前加上 static,它就变成了 静态嵌套类(Static Nested Class)。它和成员内部类最大的区别是:它不持有外部类的隐式引用,因此可以独立于外部类的实例存在。

public class Outer {
    private static String staticMsg = "静态消息";
    private String instanceMsg = "实例消息";

    // 静态嵌套类
    public static class StaticNested {
        public void printMessage() {
            // 只能访问外部类的静态成员,不能访问实例成员
            System.out.println(staticMsg);
            // System.out.println(instanceMsg); // 编译错误!
        }
    }
}

创建静态嵌套类的对象时,不需要外部类的实例:

Outer.StaticNested nested = new Outer.StaticNested();
nested.printMessage();

静态嵌套类的特点:

  • 它就像是一个独立的类,只是被“放在”了外部类的内部,方便组织代码。
  • 它只能访问外部类的静态成员,不能访问实例成员。
  • 它不持有对外部类实例的引用,所以创建时不需要外部类实例。
  • 它内部可以定义静态成员。

静态嵌套类的用途:当你需要将一个辅助类放在外部类附近,但它又不需要访问外部类的实例状态时,用静态嵌套类最合适。比如 Builder 模式中,Student.Builder 就常被定义为静态嵌套类。


3. 局部内部类 —— 方法内部的“临时工”

局部内部类是定义在方法或代码块内部的类。它的作用域仅限于那个方法或代码块,出了方法就无法使用了。

public class Outer {
    public void doSomething() {
        // 局部内部类:定义在方法内部
        class LocalInner {
            private String msg;

            public LocalInner(String msg) {
                this.msg = msg;
            }

            public void print() {
                System.out.println(msg);
            }
        }

        // 在方法内创建并使用
        LocalInner inner = new LocalInner("Hello from local");
        inner.print();
    }
}

局部内部类的特点:

  • 它在方法内部定义,只在该方法内可见。
  • 它可以访问外部类的所有成员(包括私有成员)。
  • 如果要访问方法中的局部变量,该变量必须声明为 final 或“有效 final”(即实际上没有修改过)。这是为了保证变量的值在内部类对象的使用过程中不会改变。
public void doSomething(final String prefix) {   // 参数是 final 的
    String suffix = "!!!";   // 有效 final(没有修改)
    class LocalInner {
        public void print() {
            System.out.println(prefix + suffix);  // 可以访问
        }
    }
    // suffix = "?";   // 如果取消注释,suffix 不再有效 final,编译报错
}

局部内部类在现实中使用较少,但在某些需要临时封装逻辑的场景下依然有用。


4. 匿名内部类 —— 没有名字的“快闪族”

匿名内部类是最特殊的一种内部类:它没有名字,直接在 new 关键字后面紧跟类或接口的定义,创建一个实现了某个接口或继承了某个类的对象,同时赋予它特定的行为。

匿名内部类通常用于一次性使用的情况,比如事件监听器、回调函数等。

// 示例:创建一个 Runnable 匿名内部类
Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("任务正在执行...");
    }
};
task.run();

匿名内部类通常与接口搭配使用。你也可以继承一个普通类:

// 继承 ArrayList,并添加一个打印方法
List<String> list = new ArrayList<String>() {
    {
        add("A");
        add("B");
    }
    public void printSize() {
        System.out.println("大小:" + size());
    }
};
// 但这样用得不广,更常见的是用于接口实现。

Java 8 引入 Lambda 表达式后,匿名内部类在实现单个抽象方法接口(函数式接口)时有了更简洁的替代方式。但对于需要多个方法或状态的接口,匿名内部类仍然是必要的。

// 使用 Lambda 表达式(仅适用于函数式接口)
Runnable task2 = () -> System.out.println("Lambda 任务");
task2.run();

匿名内部类的特点:

  • 没有类名,直接在 new 时定义。
  • 它定义后立即创建对象,通常只使用一次。
  • 它可以访问外部类的所有成员,以及有效 final 的局部变量。
  • 常见于 GUI 编程(如按钮点击监听)、多线程(Runnable)、集合排序(Comparator)等场景。

5. 内部类的使用场景

内部类类型典型使用场景
成员内部类作为外部类的“附属组件”,需要访问外部类的实例状态。例如:链表的 Node、迭代器实现。
静态嵌套类作为辅助类,但不依赖外部类实例。例如:Builder 类、Entry(如 Map.Entry)。
局部内部类只在某个方法内使用的临时类,比如一个算法内部的辅助数据结构。
匿名内部类一次性使用的接口实现或继承,比如事件监听、回调、即时排序器。

6. 为什么需要内部类?—— 三个核心动机

  1. 逻辑分组:如果一个类只在另一个类内部有意义,就把它放在里面,让代码组织更清晰。
  2. 增强封装:内部类可以访问外部类的私有成员,这让你能够在不暴露外部类内部细节的情况下,实现一些辅助功能。
  3. 可读性和维护性:将紧密相关的代码放在一起,降低了分散在多个文件中的维护成本。

7. 综合示例 —— 学生管理系统中的内部类应用

我们用一个贴近实际的例子来整合今天的内容:一个简单的学生管理系统,包含一个 StudentManager 类,内部用链表存储学生信息。我们用成员内部类来实现链表节点(Node),用匿名内部类来实现排序比较器,用静态嵌套类来实现建造者模式。

import java.util.*;

// ========== 外部类:学生管理器 ==========
public class StudentManager {
    // 使用链表存储学生,节点用成员内部类实现
    private Node head;
    private int size = 0;

    // ---- 成员内部类:链表节点 ----
    private class Node {
        Student data;
        Node next;

        Node(Student data) {
            this.data = data;
        }
    }

    // ---- 静态嵌套类:学生建造者(Builder模式) ----
    public static class StudentBuilder {
        private String name;
        private int age;
        private String id;

        public StudentBuilder setName(String name) {
            this.name = name;
            return this;
        }

        public StudentBuilder setAge(int age) {
            this.age = age;
            return this;
        }

        public StudentBuilder setId(String id) {
            this.id = id;
            return this;
        }

        public Student build() {
            return new Student(name, age, id);
        }
    }

    // ---- 内部数据类(Record) ----
    public record Student(String name, int age, String id) {
        @Override
        public String toString() {
            return String.format("Student{name='%s', age=%d, id='%s'}", name, age, id);
        }
    }

    // ---- 添加学生 ----
    public void addStudent(Student student) {
        Node newNode = new Node(student);
        newNode.next = head;
        head = newNode;
        size++;
    }

    // ---- 获取所有学生(使用匿名内部类实现排序) ----
    public List<Student> getStudentsSortedByAge() {
        List<Student> list = new ArrayList<>();
        Node current = head;
        while (current != null) {
            list.add(current.data);
            current = current.next;
        }

        // 使用匿名内部类实现 Comparator
        list.sort(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                return Integer.compare(s1.age(), s2.age());
            }
        });

        // 也可以使用 Lambda 表达式(更简洁)
        // list.sort((s1, s2) -> Integer.compare(s1.age(), s2.age()));

        return list;
    }

    // ---- 遍历并打印所有学生 ----
    public void printAll() {
        Node current = head;
        while (current != null) {
            System.out.println(current.data);
            current = current.next;
        }
    }

    public int size() {
        return size;
    }

    // ---- 主程序测试 ----
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();

        // 使用静态嵌套的 Builder 创建学生对象
        Student s1 = new StudentManager.StudentBuilder()
                .setName("张三")
                .setAge(20)
                .setId("S001")
                .build();

        Student s2 = new StudentManager.StudentBuilder()
                .setName("李四")
                .setAge(22)
                .setId("S002")
                .build();

        Student s3 = new StudentManager.StudentBuilder()
                .setName("王五")
                .setAge(19)
                .setId("S003")
                .build();

        manager.addStudent(s1);
        manager.addStudent(s2);
        manager.addStudent(s3);

        System.out.println("=== 所有学生(插入顺序逆序) ===");
        manager.printAll();

        System.out.println("\n=== 按年龄排序后的学生 ===");
        List<Student> sorted = manager.getStudentsSortedByAge();
        for (Student s : sorted) {
            System.out.println(s);
        }

        // 演示匿名内部类:创建一个线程打印信息
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("\n学生总数:" + manager.size());
            }
        });
        t.start();

        // Lambda 版本:更简洁
        Thread t2 = new Thread(() -> System.out.println("Lambda 方式打印总数:" + manager.size()));
        t2.start();
    }
}

这个例子融合了:

  • 成员内部类:Node 作为 StudentManager 的私有内部类,对外部隐藏实现细节。
  • 静态嵌套类:StudentBuilder 提供了整洁的对象构建方式,且不依赖外部类实例。
  • 匿名内部类:Comparator 的实现用了匿名内部类(以及 Lambda 替代版)。
  • Record:Student 本身就是一种轻量级数据类,也是一种现代的“内部”数据定义方式。

8. 内部类的一些注意事项

  • 命名冲突:内部类不能和外部类同名。
  • 序列化:内部类通常不建议序列化,因为隐式持有外部类引用会带来复杂问题。
  • 内存泄漏风险:成员内部类持有外部类实例引用,如果内部类对象长期存活,可能会导致外部类无法被垃圾回收,造成内存泄漏。在 Android 开发中,这是一个常见的陷阱。如果不需要访问外部类实例,请改用静态嵌套类。
  • 作用域:内部类的访问修饰符(private、protected、public、default)和普通类一样,你完全可以通过 private 来隐藏内部类,只对外暴露必要的接口。

9. 内部类与设计模式

内部类在经典设计模式中频繁出现:

  • Builder 模式:通常用静态嵌套类实现 Builder。
  • 迭代器模式:集合类常常用成员内部类实现迭代器。
  • 适配器模式:匿名内部类常用于创建临时适配器。
  • 观察者模式:事件监听器常常用匿名内部类实现。

了解内部类,有助于你更深入地理解这些设计模式的实现方式。


10. 今天的总结

今天我们学习了 Java 中四种重要的内部类形式:

  • 成员内部类:依附于外部类实例,可访问外部类所有成员。
  • 静态嵌套类:不依附于外部类实例,只能访问外部类静态成员。
  • 局部内部类:定义在方法内部,作用域局限于该方法。
  • 匿名内部类:没有名字,直接在 new 时定义,常用于一次性实现。

内部类让 Java 的类组织更加灵活,也让代码更内聚、更安全。在实际开发中,你可能会频繁看到它们的身影——尤其是在 GUI 编程、集合框架、第三方库的回调机制中。


动手试试

  1. 定义一个 LinkedList 类,内部用成员内部类 Node 存储元素。实现 addFirst、addLast、get、removeFirst 等基本方法。
  2. 定义一个 Calculator 类,它有一个 compute 方法,接受一个 Operation 接口(只有一个 int apply(int a, int b) 方法)。在 main 中用匿名内部类分别实现加、减、乘、除,并测试。
  3. 用静态嵌套类实现一个 Person.Builder,包含 name、age、address 等属性,支持链式调用 setXxx 方法,最后 build() 返回 Person 对象。
  4. (挑战)研究 java.util.ArrayList 的源码,看看它内部使用的迭代器 Itr 是什么样的内部类。体会一下为什么设计成内部类而不是独立类。

内部类是一种封装艺术,它让代码在结构上更紧凑,在逻辑上更自洽。熟练运用内部类,会让你的设计更加精致。

我们下一篇见。😃

📌 获取本系列示例代码请访问 GitCode。

Openclaw 附录B 常用Skills清单 核心作用支持URL、网页、PDF、图片、音频和YouTube视频的摘要与字幕提取,由OpenClaw创始人@steipete开发的官方内置Skill。安装⚠️说明:原推荐的summarize未在ClawHub验证到,YouTube字幕提取功能已内置于summarize中。使用场景“提取这个2小时Next.js教程视频的核心代码逻辑,按章节整理成学习笔记”推荐指数:⭐⭐⭐⭐。 阅读详情

相关推荐

OTN设备核心知识速记

本文章为工作笔记,若有错误,还需大家指正。不定期更新。

Hiddengold的博客 2648

java 静态内部类的使用

Java基础第十二讲:面向对象基础(六)[内部类] http://android.yaohuiji.com/archives/3247 本讲内容:内部类 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类。内部类又分为:常规内部类、局部内部类、匿名内部类和静态嵌套类四种。我们内部类的知识在Android手机开发中经常用到。 一、常规内部类 所谓常规内部类,

jiangxinyu的专栏 6万+

Win11 24H2共享访问被禁?深入聊聊SMB签名和‘不安全的来宾登录’那点事

本文深入解析Win11 24H2共享访问故障,探讨SMB签名的安全机制与‘不安全的来宾登录’问题。提供从注册表修改到组策略配置的多层次解决方案,特别针对家庭网络和打印机共享场景给出实用建议,帮助用户在安全与便利之间找到平衡。

weixin_42556197的博客 562

静态嵌套类和非静态嵌套类

什么是嵌套类及内部类? 可以在一个类的内部定义另一个类, 这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少, 最重要的是非静态嵌套类, 也即是被称作为内部类(inner).嵌套类从JDK1.1开始引入.其中inner类又可分为三种:(1) 在一个类中直接定义的内部类;(2) 在一个方法中定义的内部类;(3) 匿名内部类. ...

weixin_30682127的博客 135

Android Qcom Display学习(十一)

该系列文章总目录链接与各部分简介:本章主要是基于MIPI Payload传输接口的学习,包括Generic和DCS的接口不同。底层都是基于去封装的,下面第一部分调用原生接口,第二部分分析高通是如何进行读写操作的。

Android驱动开发 3179

单细胞转录组分析(scRNA-seq)

单细胞转录组测序(Single-cell RNA sequencing,scRNA-seq)是一种高通量测序技术,可以在单细胞水平解析基因表达情况,揭示细胞异质性,探索稀有细胞类型,并研究细胞状态转换及动态调控机制。与传统的。

大甘的博客 6147

嵌套类:静态嵌套类和非静态嵌套类

嵌套类:静态嵌套类和非静态嵌套类

克终的博客 568

ComfyUI面部修复FaceDetailer保姆级教程:从模型选择到参数调优全解析

本文提供ComfyUI面部修复FaceDetailer的保姆级教程,深度解析从模型选择到参数调优的全过程。针对常见的五官模糊、肤色不均等问题,详细对比了BBox与Segm检测器的优劣,并给出SD1.5与SDXL模型的核心参数联动策略与实战方案,帮助用户精准掌控AI绘画中的面部修复效果。

weixin_29073241的博客 471

java中类和方法都不允许嵌套定义_嵌套类(Nested Classes)

概述Java允许在一个类的内部定义一个类,这样的类称为嵌套类。例:class OuterClass { ... class NestedClass { ... } }嵌套类分为两类:静态和非静态。 用static 修饰的嵌套类称为静态嵌套类,未使用static修饰的嵌套类称为内部类。 class OuterClass { ... static...

weixin_39945475的博客 2822

【Coze搞钱实战】24. 从零实现精准用户画像:Coze+企业微信打造智能导购推送系统(附完整代码)

电商运营中,“客服重复询问用户需求、无法精准推荐”是转化率低的核心痛点——日均200人次咨询,73%的问题是重复的,首单转化率仅14%。本文基于Coze平台sys_uuid用户识别功能、企业微信API与多维表格,打造“用户行为→自动打标→标签存储→智能推送”全链路方案:通过分类分层标签体系捕捉用户偏好,Coze自动识别用户并打标,飞书多维表格存储标签数据,企业微信触发个性化推送。实操后可使客服重复询问率下降62%,意向客户转化率提升81%,首单转化率提升64%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 541

高并发网络爬虫实践(欧赔、亚盘、大小指数数据爬取)

本文通过对一个实战化的高并发网络爬虫脚本进行深度模块化剖析,展示了如何构建一个兼具性能、健壮性和易用性的数据采集工具。核心设计思想总结模块化与单一职责: 每个函数都专注于解决一个特定问题,无论是网络请求、数据解析还是文件操作。并发与效率: 通过ThreadPoolExecutor实现了高效的并发抓取,极大缩短了总耗时。健壮性与容错: 强大的重试机制、细致的异常处理和线程安全的文件写入,保证了程序在复杂网络环境下的稳定运行。断点续传: 精心设计了进度记录与恢复机制,使得大规模抓取任务变得轻松可控。

猫敷雪 475

java类嵌套_java-嵌套类

java允许在一个类中定义另外一个类,这就叫类嵌套。类嵌套分为两种,静态的称为静态嵌套类,非静态的称为内部类。使用嵌套类的原因:能够将仅在一个地方使用的类合理地组合。一个类可能只对于另外一个类有用,此时将前者组合到后者,可以使得程序包更加简洁。增强封装性。假如由两个类A和B,B类需要使用A类中的成员,而恰好该成员又是仅类内部可见的,如果将B定义为A的嵌套类,则B可以使用A的任何成员,而且B也可以声...

weixin_30416493的博客 2069

【unity实战】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)

之前有人在微信上找我,问了TileMap相关的知识【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)不过写的不是特别不是特别细致,只是简单的用了一下,所有这次特地打算单独写一篇文章,来介绍一下,下次还有人问我,我直接就把这篇文章丢给他,完美!Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。Tilemap是一个用于创建2D地图的工具。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

python嵌套类(内部类相互调用)_Java™ 教程(嵌套类)

嵌套类Java编程语言允许你在另一个类中定义类,这样的类称为嵌套类,如下所示:class OuterClass {...class NestedClass {...}}术语:嵌套类分为两类:静态和非静态,声明为static的嵌套类称为静态嵌套类,非静态嵌套类称为内部类。class OuterClass {...static class StaticNestedClass {...}class In...

weixin_39831902的博客 420

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java 临时类_java嵌套类和内部类、匿名类

java嵌套类和内部类、匿名类1、嵌套类和内部类定义可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。其中inner类又可分为三种:   1)在一个类(外部类)中直接定义的内部类;   2)在一个方法(外部类的方法)中定义的内部类;   3)匿名内...

weixin_36018119的博客 369

深度学习工具包 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")

Java | 静态嵌套类(Static Nested Class)

静态嵌套类(Static Nested Class),是 Java 中对类的一种定义方式,是嵌套类的一个分类。Java 编程语言允许一个类被定义在另一个类中,这样的类就称为嵌套类。嵌套类分为两种:静态的和非静态的。用 static 关键字来声明的嵌套类,就称为静态嵌套类。

Blume 的博客 714

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

嵌套类

目录 一、介绍 二、嵌套类 2.1、静态内部类 2.2、内部类 2.3、Shadowing(隐藏) 2.4、序列化 三、局部类 四、匿名类 五、Lambda表达式 六、方法引用 参考 一、介绍 嵌套类分为两种:静态嵌套类和内部类。内部类中又有两种特殊的内部类:局部类和匿名类。如果局部类只使用一次,则使用匿名类更简洁。如果实现的接口只有一个方法,则lambda表达式更简洁。...

千霜的博客 1582

java反射 嵌套类_Java™ 教程(嵌套类)

嵌套类Java编程语言允许你在另一个类中定义类,这样的类称为嵌套类,如下所示:class OuterClass {...class NestedClass {...}}术语:嵌套类分为两类:静态和非静态,声明为static的嵌套类称为静态嵌套类,非静态嵌套类称为内部类。class OuterClass {...static class StaticNestedClass {...}class In...

weixin_42560530的博客 407

Java嵌套类(转)

本文转自: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html 在类内部定义的类就是嵌套类,如: class OuterClass { ... class NestedClass { ... } } ...

baidu_32223873的博客 208

java嵌套内部类_java中的内部类(嵌套类)

内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。几种内部类的共性:A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。B、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。View Code1 /**2 * 四种不同类型的内部类3 *@authorAd...

weixin_33380613的博客 402

java嵌套_java-嵌套类

浏览以下内容前,请点击并阅读java允许在一个类中定义另外一个类,这就叫类嵌套。类嵌套分为两种,静态的称为静态嵌套类,非静态的又称为内部类。使用嵌套类的原因:能够将仅在一个地方使用的类合理地组合。如果一个类可能只对于另外一个类有用,此时将前者组合到后者,可以使得程序包更加简洁。增强封装性。假如由两个类A和B,B类需要使用A类中的成员,而恰好该成员又是仅类内部可见(private)的,如果将B定义为...

weixin_34194520的博客 506

3.4、嵌套类

这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。 嵌套类 Java编程语言允许你在其他类里面定义类。这样一个类我们叫做嵌套类: class OuterClass{ ··· class NestedClass{ ··· } } 术语:嵌套类一般被分为两类:静态和非静态。通过static声明的嵌套类叫做静态内部类,非静态嵌套类叫做内部类。 clas...

昨天今天和明天 227

java嵌套类和内部类、匿名类

java嵌套类和内部类、匿名类 1、嵌套类和内部类定义 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。其中inner类又可分为三种:   1)在一个类(外部类)中直接定义的内部类;   2)在一个方法(外部类的方法)中定义的内部类;

andychen314的专栏 1611

JAVA Nested Class -- Java 嵌套类

1.Nested Class 嵌套类 JAVA语言允许你在一个类里面定义另外一个类,这样的类被称为嵌套类。举例如下: class OuterClass { ... class NestedClass { ... } } 术语:嵌套类分为2大类:静态和非静态。被声明为static的嵌套类称为静态嵌套类;非静态嵌套类则被称为内部类。 class OuterClass { ... s...

weixin_43986527的博客 258

内部类、嵌套类

注意:java编译器编译任何一个类时,会为其产生一个.class文件,嵌套类就会产生两个.class文件。 1 public class Outer { 2 3 /** 4 * @param args 5 */ 6 int outer_in = 100; 7 public class Iner{ // 内部类只能在外部类...

weixin_30652879的博客 95

Nested Classes(嵌套类) - Java™ Tutorials 翻译

一、原文地址: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html 二、原文翻译: 1、嵌套类 java编程语言允许在另一个类内部定义一个类。这样的类被叫做嵌套类,这里举例说明: /** 外部类 **/ public class OuterClass { /** 嵌套类 **/ ...

Turnhead的专栏 575
上一篇: 22. 【Java】接口:契约的力量
下一篇: 24. 【Java】枚举:更安全的常量
gugucoding
博客等级 码龄140天 7粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值