JavaSE-抽象类和接口详解

【Java SE】 带你走近Java的抽象类与接口 上一篇文章我们讲了Java中的两大特性:继承和多态,在多态中父类的方法被子类重写,在程序执行的时候,因为动态绑定的原因不会去访问父类的被重写的方法,那么父类的方法里面的内容是不是可以直接不写 ,这样使得代码简洁。不写要不要加什么关键字呢?接下来让我们来学习抽象类吧! 阅读详情

一、抽象类

1. 为什么要有抽象类?

问题场景:

class Animal {
    // eat()和speak()具体应该怎么写呢?没法写
    public void eat() {
        // 空实现,没有实际意义
    }
    
    public void speak() {
        // 空实现,没有实际意义
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
    
    @Override
    public void speak() {
        System.out.println("汪汪汪");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
    
    @Override
    public void speak() {
        System.out.println("喵喵喵");
    }
}

问题分析:

  • 父类Animal中的eat()和speak()方法无法给出具体实现

  • 每个子类都有差异化的行为

  • 父类中的空方法没有实际意义,反而可能误导使用者

解决方案:​ 使用抽象类,将无法确定具体实现的方法声明为抽象方法

2. 抽象类的语法

// 抽象类使用abstract修饰
abstract class Animal {
    // 普通属性
    private String name;
    
    // 抽象方法:只有声明,没有实现
    public abstract void eat();
    public abstract void speak();
    
    // 普通方法:可以有具体实现
    public void sleep() {
        System.out.println("动物在睡觉");
    }
    
    // 构造方法
    public Animal(String name) {
        this.name = name;
    }
    
    // getter方法
    public String getName() {
        return name;
    }
}

// 子类必须重写所有抽象方法
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    
    @Override
    public void eat() {
        System.out.println(getName() + "吃骨头");
    }
    
    @Override
    public void speak() {
        System.out.println("汪汪汪");
    }
}

class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
    
    @Override
    public void eat() {
        System.out.println(getName() + "吃鱼");
    }
    
    @Override
    public void speak() {
        System.out.println("喵喵喵");
    }
}

// 使用示例
public class Test {
    public static void main(String[] args) {
        Animal dog = new Dog("小黑");
        Animal cat = new Cat("小花");
        
        dog.eat();      // 小黑吃骨头
        dog.speak();     // 汪汪汪
        dog.sleep();     // 动物在睡觉
        
        cat.eat();      // 小花吃鱼
        cat.speak();     // 喵喵喵
    }
}

3. 抽象类的特点

核心特性:

  1. 不能实例化:抽象类不能直接创建对象

    // Animal animal = new Animal();  // 编译错误!
    Animal animal = new Dog("小黑");  // 正确:多态
  2. 可以有构造方法:便于子类调用

    abstract class Animal {
        private String name;
    
        public Animal(String name) {
            this.name = name;
        }
        // ...
    }
  3. 子类必须重写抽象方法:除非子类也是抽象类

    abstract class Bird extends Animal {
        // 可以不重写抽象方法,但Bird也必须是抽象类
    }
  4. 可以有普通方法:这是抽象类和接口的重要区别

  5. 可以有成员变量:普通类有的,抽象类都可以有

4. 抽象类 vs 普通类

对比项

抽象类

普通类

实例化​

不能直接实例化

可以直接实例化

方法​

可以有抽象方法

不能有抽象方法

继承​

必须被继承

可以被继承

构造方法​

可以有

可以有

成员变量​

可以有

可以有

使用场景​

作为模板,定义规范

具体实现

二、接口

1. 为什么要有接口?

问题场景:

class Bird extends Animal {
    public void fly() {
        System.out.println("鸟会飞");
    }
}

class Plane {
    public void fly() {
        System.out.println("飞机会飞");
    }
}

class Superman {
    public void fly() {
        System.out.println("超人会飞");
    }
}

问题分析:

  • Bird、Plane、Superman都有fly()方法

  • 但它们之间没有继承关系

  • 需要一种机制来描述"会飞"这个行为特征

解决方案:​ 使用接口,定义一组行为规范

2. 接口的语法

// 定义接口
interface Flyable {
    // 接口中的方法默认是public abstract
    void fly();
    
    // JDK 8开始,接口可以有默认方法
    default void takeOff() {
        System.out.println("起飞");
    }
    
    // JDK 8开始,接口可以有静态方法
    static void showInfo() {
        System.out.println("这是一个飞行接口");
    }
}

// 实现接口
class Bird extends Animal implements Flyable {
    public Bird(String name) {
        super(name);
    }
    
    @Override
    public void eat() {
        System.out.println(getName() + "吃虫子");
    }
    
    @Override
    public void speak() {
        System.out.println("叽叽喳喳");
    }
    
    @Override
    public void fly() {
        System.out.println(getName() + "在天空飞翔");
    }
}

class Plane implements Flyable {
    @Override
    public void fly() {
        System.out.println("飞机在飞行");
    }
}

// 使用示例
public class Test {
    public static void main(String[] args) {
        Flyable bird = new Bird("小燕子");
        Flyable plane = new Plane();
        
        bird.fly();         // 小燕子在天空飞翔
        bird.takeOff();     // 起飞(默认方法)
        
        plane.fly();        // 飞机在飞行
        
        Flyable.showInfo(); // 这是一个飞行接口(静态方法)
    }
}

3. 接口的特点

核心特性:

  1. 不能实例化:接口不能直接创建对象

    // Flyable flyable = new Flyable();  // 编译错误!
    Flyable flyable = new Bird("小鸟");  // 正确:多态
  2. 实现类必须重写所有抽象方法:除非实现类是抽象类

  3. 接口可以多实现:一个类可以实现多个接口

    interface Swimmable {
        void swim();
    }
    
    class Duck extends Animal implements Flyable, Swimmable {
        // 必须重写所有抽象方法
        @Override
        public void fly() { /* ... */ }
    
        @Override
        public void swim() { /* ... */ }
    
        @Override
        public void eat() { /* ... */ }
    
        @Override
        public void speak() { /* ... */ }
    }
  4. 接口可以继承接口:支持多继承

    interface A {
        void methodA();
    }
    
    interface B extends A {
        void methodB();
    }
    
    class C implements B {
        @Override
        public void methodA() { /* ... */ }
    
        @Override
        public void methodB() { /* ... */ }
    }
  5. JDK 8+特性:

    • 默认方法(default)

    • 静态方法(static)

    • 私有方法(private,JDK 9+)

4. 接口 vs 抽象类

对比项

接口

抽象类

方法​

都是抽象方法(JDK 8前)

可以有抽象方法和普通方法

成员变量​

只能是常量(public static final)

可以有普通变量

构造方法​

不能有

可以有

实现方式​

实现(implements)

继承(extends)

数量限制​

一个类可以实现多个接口

一个类只能继承一个抽象类

设计理念​

行为规范

模板设计

使用场景​

定义能力、行为

定义模板、通用功能

5. 接口的成员

interface MyInterface {
    // 常量(默认public static final)
    int MAX_VALUE = 100;
    String DEFAULT_NAME = "default";
    
    // 抽象方法(默认public abstract)
    void method1();
    
    // 默认方法(JDK 8+)
    default void defaultMethod() {
        System.out.println("默认方法");
        privateMethod();  // 调用私有方法
    }
    
    // 静态方法(JDK 8+)
    static void staticMethod() {
        System.out.println("静态方法");
    }
    
    // 私有方法(JDK 9+)
    private void privateMethod() {
        System.out.println("私有方法");
    }
}

三、综合应用示例

// 定义多个接口
interface Flyable {
    void fly();
}

interface Swimmable {
    void swim();
}

interface Runnable {
    void run();
}

// 抽象类
abstract class Animal {
    private String name;
    private int age;
    
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public abstract void eat();
    
    public void sleep() {
        System.out.println(name + "在睡觉");
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}

// 具体实现类
class Duck extends Animal implements Flyable, Swimmable, Runnable {
    public Duck(String name, int age) {
        super(name, age);
    }
    
    @Override
    public void eat() {
        System.out.println(getName() + "吃小鱼");
    }
    
    @Override
    public void fly() {
        System.out.println(getName() + "在低空飞行");
    }
    
    @Override
    public void swim() {
        System.out.println(getName() + "在游泳");
    }
    
    @Override
    public void run() {
        System.out.println(getName() + "在奔跑");
    }
}

class Eagle extends Animal implements Flyable {
    public Eagle(String name, int age) {
        super(name, age);
    }
    
    @Override
    public void eat() {
        System.out.println(getName() + "吃兔子");
    }
    
    @Override
    public void fly() {
        System.out.println(getName() + "在高空翱翔");
    }
}

// 测试类
public class Test {
    public static void main(String[] args) {
        Duck duck = new Duck("唐老鸭", 3);
        Eagle eagle = new Eagle("老鹰", 5);
        
        // 鸭子多才多艺
        duck.eat();
        duck.fly();
        duck.swim();
        duck.run();
        duck.sleep();
        
        System.out.println("----------------");
        
        // 老鹰专精飞行
        eagle.eat();
        eagle.fly();
        eagle.sleep();
        
        System.out.println("----------------");
        
        // 多态应用
        Flyable[] flyables = {duck, eagle};
        for (Flyable flyable : flyables) {
            flyable.fly();
        }
    }
}

四、总结

1. 抽象类的使用场景

  • 需要定义模板方法,让子类重写部分方法

  • 需要定义一些通用属性和方法

  • 需要定义构造方法

  • 子类之间存在"is-a"关系

2. 接口的使用场景

  • 定义行为规范,不关心具体实现

  • 需要多继承的场景

  • 定义能力、角色、特征

  • 实现类之间可能存在"has-a"关系

3. 设计原则

  • 面向接口编程:优先使用接口定义行为

  • 单一职责原则:一个接口只定义一组相关行为

  • 接口隔离原则:不要定义过于臃肿的接口

  • 依赖倒置原则:高层模块不应该依赖低层模块,两者都应该依赖抽象

4. 最佳实践

  • 抽象类用于代码复用和模板设计

  • 接口用于定义规范和扩展能力

  • 合理使用多态,提高代码的灵活性和可扩展性

  • 根据实际需求选择抽象类或接口,不要过度设计

通过合理使用抽象类和接口,可以设计出结构清晰、易于扩展、符合面向对象设计原则的程序架构。

ROS & ROS2 机器人深度相机激光雷达多传感器标定工具箱入门教程(一) multisensor_calibration 是一个积极维护的通用标定工具箱,用于辅助基于目标的多传感器标定,支持 ROS 1 和 ROS 2。它提供了多种方法和应用来标定复杂的多传感器系统,例如。 阅读详情

相关推荐

自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)

具有相同电荷的电子相互排斥。结果,为了在极其拥挤的环境中相互超越,他们不得不改变自己的行为。剑桥大学和英国伯明翰大学于 2009 年 7 月发表的研究表明,电子可以通过量子隧穿从金属表面跳到相近位置的量子线上,这样做后,将分离成两个准粒子,命名为的自旋子和全子。Van den Brink、Khomskii 和 Sawatzky 在 1997-1998 年对轨道子进行了理论上的预测。在 2011 年 9 月发给出版商的论文中报告了它作为一个单独的准粒子的实验观察结果。

qq_32515081的博客 1万+

JavaSE——抽象类和接口详解

一文学会抽象类与接口

chenchenchencl的博客 1065

计算机视觉与深度学习实战:以Python为工具,基于帧间差法进行视频目标检测

计算机视觉是一门研究如何使机器从数字图像或视频中提取、分析和理解有用信息的学科。它涉及图像处理、计算机图形学、人工智能等多个领域的知识。通过计算机视觉技术,我们可以实现图像的识别、分类、目标检测等功能。本文介绍了计算机视觉与深度学习的基本概念和原理,并以Python为工具,基于帧间差分法实现了视频目标检测。帧间差分法具有算法实现简单、程序设计复杂度低、对光线等场景变化不太敏感等优点,因此在实际应用中得到了广泛的应用。然而,帧间差分法也存在一些局限性,如对于缓慢移动或静止的物体检测效果不佳。

一个好知识的传播者 1256

【JavaSE】Java入门七(抽象类和接口详解)

被abstract// 抽象类:被abstract修饰的类// 抽象方法:被abstract修饰的方法,没有方法体// 抽象类也是类,也可以增加普通方法和属性// 面积抽象类中可以包含被abstract修饰的抽象方法,抽象方法在抽象类中仅仅被声明,具体的实现代码可以在继承他的类中被实现。注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法Java中类不能实现多继承,为了让一个类继承多个类型,Java中引入了接口,接口也是一种引用数据类型,可以把他当做比抽象类更抽象的引用数据类型。

2203_75565612的博客 1275

项目回顾一:《高速多端口共享缓存模块》

本帖子仅为了回顾一下一年前自己动手完成的第一个数字ic设计项目的历程,为复试做一下准备,完成的这个sramc模块花了整整四个月的时间,从0到12个模块的代码产出以及模块的验证,虽然没有拿奖,也没有进入复赛,设计过程中使用的技术手段和算法也不太成熟,但这这是一个值得记录的过程!

weixin_60261760的博客 1254

零基础玩转STM32CubeIDE LL库:5分钟搞定串口通信(附完整代码)

本文为零基础开发者提供了一份STM32CubeIDE LL库串口通信的快速实战指南。通过CubeMX配置、LL库核心API详解,以及中断接收与环形缓冲区的完整代码实现,帮助读者在5分钟内搭建稳定可靠的串口收发框架,解决从HAL切换到LL库的常见困惑,提升嵌入式开发效率。

weixin_29159441的博客 306

JavaSE基础知识-面向对象-接口与抽象类详解

在面向对象编程中,抽象类和接口是实现代码复用、规范行为的重要工具。本文通过一个 "动物世界" 的示例代码,聊聊抽象类、接口、继承与多态的实际应用,帮助大家理解这些概念的核心意义。

2503_91308956的博客 955

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 303

javaSE之包、继承、多态、抽象类和接口详解

目录包包的本质包的命名包的引用包的细节常用包介绍继承基本介绍使用细节多态基本介绍使用细节抽象类基本介绍使用细节接口基本介绍使用细节常用接口总结 包 包的本质 包的本质就是创建不同的文件夹来保存同一个程序所需要的类文件 包的命名 命名规则:只能包含数字、字母、下划线、小圆点,但不能用数字开头,不能是关键字或保留字 命名规范:一般是小写字母+小圆点,规定通常是域名的倒写,如www.baidu.com====> com.baidu.www 包的引用 不同包中含有同名类时在创建对象引用时需要在对象

weixin_52477733的博客 754

YOLOv12 改进 | Backbone改进 3

将CSP中的简单拼接改为可学习的特征选择门控,动态决定哪些特征流向下一层,同样再写这篇。:相比静态CSP的固定50/50分割,门控机制可学习0.3:0.7等最优比例。在输入端加入轻量SR模块,对下采样后的特征进行超分恢复,提升小目标检测能力。(小目标): 从 0.51 AP → 0.63 AP (+24%):采用ESPCN的高效亚像素卷积,避免传统插值的信息损失。:从通道级(SE)到空间级(Spatial)的多粒度控制。:结合浅层细节和深层语义,恢复小目标的纹理信息。

u012133341的博客 839

【VibeCoding系列】小白入门指南:模型选择、编辑器选择、项目预定全分析

开箱即用:下载安装就能用,不用配 API Key(也可以自己配)Cmd+K 快速修改:选中代码,按 Cmd+K,直接让 AI 修改Cmd+L 对话:侧边栏聊天,支持引用文件和代码@文件引用:输入 @ 就能引用项目中的文件,AI 自动读取上下文Agent 模式:告诉 AI 一个需求,它自动跨文件修改下载地址cursor.com(免费版有额度限制,足够入门)✅下载 Cursorcursor.com),安装打开✅选一个小项目(个人名片页 or Todo List)✅按照七步工作流开干。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 209

JavaSE 面向对象程序设计进阶 抽象类和接口 2024年详解

关键字interface 定义接口接口不能实例化,不能创建对象关键字implements 表示类与接口之间的实现关系public interface 接口名{}public class 类名 implements 接口名{}接口的子类 实现类1.要么重写接口中所有的抽象方法2.要么是抽象类。

多多的博客 11万+

【计算机视觉 | MMDetection】关于mmdetection如何计算参数量、计算量和速度FPS

【计算机视觉 | MMDetection】关于mmdetection如何计算参数量、计算量和速度FPS

wzk4869的博客 3021

【JavaSE】面向对象编程必备技能,你学会了吗(继承、多态、抽象类、接口详解)

当一个大型程序交由数个不同的程序开发人员进行开发时,用到相同的类名是很有可能的,在java程序开发中为了避免上述事件,提供了一个包的概念(package),使用方法很简单,只需要在写的程序第一行使用 package 关键字来声明一个包。

weixin_46531416的博客 1103

IDEA的使用指南

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JavaSE学习 day06

今天,我学习了JavaSE库存管理中的修改、删除用户;关闭连接,释放资源;SQL问号占位;查询列表显示部门名称;转成web项目——登录功能。还学习了集合List、抽象类、final关键字、多态、接口。 抽象类需要注意以下几点: abstract放在class前,指明该类是抽象类 abstract放在方法声明中,则该方法是抽象方法,抽象方法没有方法体 一个抽象类可以含有多个抽象方法,也可以含有已实现的方法 抽象方法必须在子类中被实现,除非子类是抽象类 抽象类示例: /形状抽象类/ public abstrac

m0_49528461的博客 162

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《Oracle Java SE编程指南》15-02:类实现接口

课程封面-JavaSE-AT阿宝哥 内容导航: 前言 1、类实现接口 2、语法形式 3、示例 前言 抽象类存在的意义是作为父类,也就是定义了子类的共同特征,抽象类中往往既有抽象方法,又有具体方法。 接口的作用和抽象类类似,也不能直接创建对象,都是被其他类实现,implements,本质和extends一样。 1、类实现接口 类实现接口,本质上与类继承类相似,区别在于“类最多只能...

西安极客联盟 297

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

【JavaSE】抽象类和接口

文字配色重点突出,图文代码注释详解,带你愉快学习抽象类和接口。

bit me的博客 1578

JavaSE——抽象类和接口

Java中的抽象类和接口是两种重要的抽象机制。抽象类使用abstract关键字定义,不能被实例化,可包含抽象方法和具体方法,主要用于作为父类定义子类的共同行为。接口使用interface关键字声明,定义方法规范但不提供实现,支持多实现和默认方法。抽象类和接口的关键区别在于:抽象类可以有构造方法和成员变量,而接口只能有常量和抽象方法;类只能单继承抽象类,但可实现多个接口。两者都支持多态,但接口更适用于定义行为规范,抽象类更适合代码复用。

2302_77280725的博客 777

javaSE中抽象类和接口

javaSE中抽象类和接口 一、抽象类 什么是抽象类??? 包含抽象方法的类,什么是抽象方法呢? 抽象方法,就是方法没有具体实现的方法用abstract修饰 1.1、抽象类不能被实例化 抽象类和普通类的区别: 抽象类比普通类多了抽象方法 1.2、抽象类可以拥有和普通类一样的方法和成员 1.3、一个普通类继承了抽象类,那必须重写抽象方法 1.4、抽象类主要是用来继承的,一个抽象类A继承抽象类Shape,可以不用重写抽象方法 1.5、如果一个普通B类继承了抽象类A,抽象类A又继承了抽象类 Sphea,

ryy1999的博客 344

JavaSE-抽象类和接口

抽象类不能直接实例化对象抽象方法不能private的抽象方法不能被final和static所修饰的,因为抽象方法要重写抽象类必须被继承,并且子类要重写抽象方法,否则子类也是抽象类,必须也用abstract来修饰抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。

2301_80873677的博客 1101

JavaSE抽象类和接口

增加了一层编译器的校验1.接口内的变量默认类型为public static final2.方法默认的是抽象方法所有。

captain376的博客 549

JAVASE——抽象类和接口

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,。没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract method), 包含抽象方法的类我们称为 抽象类(abstract class).

2401_82848543的博客 360

java视频推荐_Java 的视频教程有推荐吗?

自学怎么可能不学习这套视频教程呢?视频教程到底怎么样,你可以具体往下看看。这套视频教程讲解JavaSE的高级技术,包括程序调试技术,抽象类与接口的基本应用,异常处理及异常在开发中的应用,使用数组存储数据, Java常用类以及常用类的常用操作,Collection集合及Map集合的特点及应用, 使用IO流读写文件内容, 开发多线程应用程序及线程同步,反射技术的基本使用等内容。内容知识点包含:一、面向...

weixin_42680139的博客 2621

JAVASE的学习笔记(四)(抽象类,代码块,接口)

JAVASE的学习笔记(四) 代码块 java中首先是静态块先执行,静态方法,最后是构造函数 普通代码块:是在方法内部中使用(普通代码块中定义的变量是局部变量作用范围只能在代码块的范围,并且名称不能和局部变量重复) 注意:执行子类的构造方法,先执行父类的构造方法,初始化代码优于构造方法之前执行,构造方法在new对象的时候执行,而静态语句块和静态方法在类加载到内存的时候就已经执行了。 初始化代码块:基本不使用,在创建对象的时候,我们会对成员变量进行初始化操作,是针对成员变量赋值使用(每次创建对象,初始化代码

qq_47267252的博客 262
上一篇: JavaSE-面向对象三大特性:封装、继承、多态详解
下一篇: Java集合框架学习笔记
StackNoOverflow
博客等级 码龄1年 22粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值