5000字详细解说什么是面向对象编程的三⼤特性—封装、继承、多态

C++学习——面向对象三大特性:封装、继承、多态 今天来更新面向更新的三大特性,分别是封装、继承、多态,是C++面试中常考也是非常重要的面试题之一,如果最近有春招的宝可以关注我噢,我会定时分享C++相关常考的知识与面试题哒! 阅读详情

封装

把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。

通俗的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。 通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。但是如果⼀个类没有提供给外界访问的⽅法,那么这个类也没有什么意义了。

我们来看一个常见的 类,比如:Student

public class Student implements Serializable { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 复制代码

将对象中的成员变量进行私有化,外部程序是无法访问的。对外提供了访问的方式,就是set和get方法。 而对于这样一个实体对象,外部程序只有赋值和获取值的权限,是无法对内部进行修改

继承

继承 就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:

class 父类 { } class 子类 extends 父类 { } 复制代码

继承概念的实现方式有二类:实现继承与接口继承。

实现继承是指直接使用基类的属性和方法而无需额外编码的能力 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力 一般我们继承基本类和抽象类用 extends 关键字,实现接口类的继承用 implements 关键字。

注意点:

通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 子类可以拥有父类的属性和方法。 子类可以拥有自己的属性和方法, 即⼦类可以对⽗类进⾏扩展。 子类可以重写覆盖父类的方法。 JAVA 只支持单继承,即一个子类只允许有一个父类,但是可以实现多级继承,及子类拥有唯一的父类,而父类还可以再继承。

使用implements关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

# implements 关键字 public interface A { public void eat(); public void sleep(); } public interface B { public void show(); } public class C implements A,B { } 复制代码

值得留意的是: 关于父类私有属性和私有方法的继承 的讨论 这个网上 有大量的争论,我这边以Java官方文档为准: With the use of the extends keyword, the subclasses will be able to inherit all the properties of the superclass except for the private properties of the superclass. 子类不能继承父类的私有属性(事实),但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。

官方文档 明确说明: private和final不被继承,但从内存的角度看的话:父类private属性是会存在于子类对象中的。

通过继承的方法(比如,public方法)可以访问到父类的private属性

如果子类中存在与父类private方法签名相同的方法,其实相当于覆盖

个人觉得文章里的一句话很赞,我们不可能完全继承父母的一切(如性格等),但是父母的一些无法继承的东西却仍会深刻的影响着我们。

多态

同一个行为具有多个不同表现形式或形态的能力就是 多态。网上的争论很多,笔者个人认同网上的这个观点:重载也是多态的一种表现,不过多态主要指运行时多态

Java 多态可以分为 重载式多态和重写式多态:

-重载式多态,也叫编译时多态。编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。也就是说这种多态再编译时已经确定好了。 -重写式多态,也叫运行时多态。运行时多态是动态的,主要指继承父类和实现接口时,可使用父类引用指向子类对象实现。这个就是大家通常所说的多态性。 这种多态通过动态绑定(dynamic binding)技术来实现,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。 这种多态可通过函数的重写以及向上转型来实现。

多态存在的三个必要条件:

继承 重写 父类引用指向子类对象:Parent p = new Child();

我们一起来看个例子,仔细品读代码,就明白了:

@SpringBootTest class Demo2021ApplicationTests { class Animal { public void eat(){ System.out.println("动物吃饭!"); } public void work(){ System.out.println("动物可以帮助人类干活!"); } } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void sleep() { System.out.println("猫会睡懒觉"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } } @Test void contextLoads() { //part1 Cat cat_ = new Cat(); cat_.eat(); cat_.sleep(); cat_.work(); //part2 Animal cat=new Cat(); cat.eat(); cat.work(); cat.sleep();//此处编译会报错。 Animal dog=new Dog(); dog.eat();//结果为:吃骨头。此处调用子类的同名方法。 //part3 //如果想要调用父类中没有的方法,则要向下转型,这个非常像"强转" Cat cat222 = (Cat)cat; // 向下转型(注意,如果是(Cat)dog 则会报错) cat222.sleep(); //结果为:猫会睡懒觉。 可以调用 Cat 的 sleep() } } 复制代码

我们来看上面part1部分:

Cat cat_ = new Cat(); cat_.eat(); cat_.sleep(); cat_.work(); 复制代码

结果:

吃鱼 猫会睡懒觉。 动物可以帮助人类干活!

cat_.work(); 这处继承了父类Animal的方法,还是很好理解的 我们接着看part2:

Animal cat=new Cat(); cat.eat(); cat.work(); cat.sleep();//此处编译会报错。 Animal dog=new Dog(); dog.eat();//结果为:吃骨头。此处调用子类的同名方法。 复制代码

这块就比较特殊了,我们一句句来看

Animal cat=new Cat(); 像这种这个 父类引用指向子类对象,这种现象叫做:"向上转型",也被称为多态的引用。

cat.sleep();这句 编译器会提示 编译报错。 表明:当我们当子类的对象作为父类的引用使用时,只能访问子类中和父类中都有的方法,而无法去访问子类中特有的方法

值得注意的是:向上转型是安全的。但是缺点是:一旦向上转型,子类会丢失的子类的扩展方法,其实就是 子类中原本特有的方法就不能再被调用了。所以cat.sleep()这句会编译报错。

cat.eat();这句的结果打印:吃鱼。程序这块调用我们Cat定义的方法。

cat.work();这句的结果打印:动物可以帮助人类干活! 我们上面Cat类没有定义work方法,但是却使用了父类的方法,这是不是很神奇。其实此处调的是父类的同名方法

Animal dog=new Dog();dog.eat();这句的结果打印为:吃骨头。此处调用子类的同名方法。

由此我们可以知道当发生向上转型,去调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。如果子类没有同名方法,会再次去调父类中的该方法

​

 

我们现在知道了 向上转型时会丢失子类的扩展方法,哎,但我们就是想找回来,这可咋办? 向下转型可以帮助我们,找回曾经失去的

​

我们来看part3:

Cat cat_real = (Cat)cat; //注意 此处的cat 对应上面父类Animal,可不是子类 cat_real.sleep(); 复制代码

Cat cat = (Cat)cat; cat222.sleep(); 这个向下转型非常像"强转"。

打印的结果:猫会睡懒觉。此处又能调用了 子类Cat 的 sleep()方法了。

一道简单的面试题

我们再来看一道有意思的题,来强化理解

public class Main { static class Animal{ int weight = 10; public void print() { System.out.println("this Animal Print:" + weight); } public Animal() { print(); } } static class Dog extends Animal { int weight = 20; @Override public void print() { System.out.println("this Dog Print:" + weight); } public Dog() { print(); } } public static void main(String[] args) { Dog dog = new Dog(); System.out.println("---------------"); Animal dog222 = new Dog(); Dog dog333 = (Dog)dog222; System.out.println("---------------"); Dog dog444 = (Dog)new Animal(); } } 复制代码

执行结果:

this Dog Print:0 this Dog Print:20 this Dog Print:0 this Dog Print:20 this Animal Print:10 Exception in thread "main" java.lang.ClassCastException: com.zj.MainAnimalcannotbecasttocom.zj.MainAnimal cannot be cast to com.zj.MainAnimalcannotbecasttocom.zj.MainDog at com.zj.Main.main(Main.java:15)

做对了嘛,不对的话,复制代码去idea中debug看看

​我们先看第一部分

Dog dog = new Dog();

程序内部的执行顺序:

先 初始化 父类Animal 的属性 int weight=10 然后 调用父类Animal的构造方法,执行print() 实际调用子类Dog的print()方法,打印:this Dog Print:0,由于此时的子类属性weight 并未初始化 初始化 子类Dog 的属性 int weight=20 调用 子类Dog的构造方法,执行print() 实际调用当前类的print()方法,打印this Dog Print:20

其中有几处我们需要注意一下:实例化子类dog,程序会去默认优先实例化父类,即子类实例化时会隐式传递Dog的this调用父类构造器进行初始化工作,这个和JVM的双亲委派机制有关,这里就不展开讲了,先挖个坑,以后再来填🙃。

当程序调用父类Animal的构造方法时,会隐式传递Dog的this,类似于:

Dog dog = new Dog(this); static class Animal{ public Animal(this) { print(this);//子类又把print()给重写了 } } static class Dog extends Animal { public Dog(this) { print(this);//此时子类的 属int weight 被没有初始化默认为0 } } 复制代码

这块其实和JVM的虚方法表有关,这又是一个大坑,以后慢慢填🙃。

我们接着看第2部分 Animal dog222 = new Dog();这句是向上转型,程序加载顺序和第一部分Dog dog = new Dog();是一样的,都是实例化类的过程 Dog dog333 = (Dog)dog222;这个是向下转型,并没有调用类构造器,这块等会和第3部分结合讲

最后我们来看下第3部分Dog dog444 = (Dog)new Animal();这句先实例化Andimal类,它没有父类,就直接实例化当前类,打印this Animal Print:10。然后(Dog)表示向下转型,但是为啥运行会报ClassCastException 异常呢?且第2部分Dog dog333 = (Dog)dog222;却没有问题?

我们可以发现,向下转型可以让子类找回其独有的方法 但是向下转型是不安全的,实现 向下转型 前需要先实现 向上转型。

Java基础面向对象中的三大特性【封装、继承、多态】 本文是对面向对象编程三大特性:【封装、继承、多态】的一个学习总结。其中多有不足之处,希望大家多多指出。 阅读详情

相关推荐

Python 面向对象之封装

封装:封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。  封装的意义:封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。良好的封装能够减少耦合。可以对成员进行更精确的控制。 1. 保护数据成员...

esun的博客 429

封装,继承,多态

面向对象程序三大特性:封装、继承、多态。面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说 就是套壳屏蔽细节。比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。对于计算机使用者而言,不用关心内部核心部件,

qq_59561046的博客 6148

迅雷网络Android开发工程师(浏览器)面试指南

迅雷网络招聘Android开发工程师(浏览器方向),要求候选人具备扎实的移动开发技术和浏览器应用优化经验。岗位职责包括浏览器功能开发、WebView组件优化、小说/漫画阅读模块开发及客户端架构设计。职位要求本科及以上学历,精通Java/Kotlin,熟悉Android性能优化,有浏览器开发经验者优先。本文为应聘者提供全面的面试指南,涵盖编程基础、WebView优化、阅读模块实现、性能调优等核心内容,帮助候选人系统准备技术面试。通过实际案例和代码示例,详细解析常见面试问题及解决方案,助力应聘者展现专业能力。

郑伟强dev的专栏 349

Java系列——封装、继承、多态初了解

封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。将类的某些信息隐藏在类的内部,不允许外部程序进行直接的访问调用。通过该类提供的方法来实现对隐藏信息的操作和访问。隐藏对象的信息。留出访问的对外接口。​ 举个比较通俗的例子,比如我们的USB接口。如果我们需要外设且只需要将设备接入USB接口中,而内部是如何工作的,对于使用者来说并不重要。而USB接口就是对外提供的访问接口。

wct040923的博客 1万+

Python与西门子PLC数据交互实战:基于Snap7的跨平台工业通信指南

本文详细介绍了如何使用Python和Snap7库实现与西门子PLC的数据交互。内容涵盖跨平台环境搭建、连接参数配置、数据读写实战及性能优化技巧,为工业自动化、数据采集和智能制造场景提供了一套轻量、灵活且高效的通信解决方案。

vim8coder的博客 291

别再死记硬背注意力机制了!用Python+PyTorch从零实现一个HAN(Hierarchical Attention Network)

本文详细介绍了如何使用Python和PyTorch从零实现Hierarchical Attention Network(HAN),通过代码级解析帮助读者深入理解层次注意力机制。文章涵盖词级和句子级注意力层的构建、完整HAN架构的实现、训练技巧及注意力可视化方法,特别适合希望掌握高级NLP技术的开发者。

weixin_28744423的博客 165

【Java基础】 ⾯向对象编程三⼤特性 --封装、继承、多态

【Java基础】 ⾯向对象编程三⼤特性 --封装、继承、多态

小牛呼噜噜的博客 1514

光储微电网混合储能系统的控制策略

随着社会生产力的不断提高,对不可再生资源的大量消耗,人们已经意识到发展可再生能源的重要性,因此微电网技术作为再生能源利用的有效形式被快速发展。蓄电池容量无限大是传统光储微电网混合储能系统控制策略一种理想形式,但实际上蓄电池的容量是有限度的,传统控制策略在蓄电池剩余电量达到阖值时将无法正常使用,由此提出了光储微电网混合储能系统的新型控制策略,又结合实际情况,对开关进行了改进,利用开关与二极管并联,使其拥有四种工作状态,当储能元件剩余电量达到阈值时,可自动恢复电量降低成本,提高并输出电池电能质量。

nhkg888的博客 1748

封装、继承、多态

面向对象编程(Object-Oriented Programming, OOP)的三大特征是封装、继承和多态,它们共同构成了面向对象编程的基本原则,有助于编写模块化、可维护和可扩展的代码。

m0_74064480的博客 5246

当R语言遇见MaxENT:参数优化的艺术与自动化调参实践

本文探讨了R语言与MaxENT在生态位建模中的结合应用,重点介绍了参数优化与自动化调参的实践方法。通过caret与ENMeval工具链,研究人员可以高效处理多物种、多环境变量的大规模分析任务,提升模型性能与工作效率。文章还涵盖了从数据准备到结果可视化的全流程,为生态学家提供了实用的技术指导。

corn8的博客 456

Megatron单机多卡Qwen2.5:pre-train+sft

英伟达:https://github.com/NVIDIA/Megatron-LM/releases/tag/core_r0.8.0阿里:https://github.com/alibaba/Pai-Megatron-Patch/releases/tag/v0.10.2。

weixin_46873015的博客 2180

封装、继承、多态 详解

封装、继承、多态详解,小白可学

qq_49190652的博客 4万+

嵌入式内存管理之“LittleFS文件系统”开发(附LittleFS项目源码)

本文介绍了如何在嵌入式系统中实现 LittleFS 文件系统,并结合 Flash 存储进行数据管理。通过详细的代码示例,展示了如何配置、挂载 LittleFS 文件系统,并进行文件操作,如读取、写入和更新数据。特别地,博客通过实际应用演示了如何实现启动计数功能,以及如何处理文件系统的格式化和挂载过程。该示例帮助读者掌握在资源受限的嵌入式环境中实现高效文件存储管理的关键技术。

Bit_Dong的博客 3192

简述什么是封装性、继承性和多态性

封装就是把普通的对象进行封装,对象的属性设为私有的,对外提供get和set方法,其他类只能通过get和set对对象属性值进行操作。继承是发生在两个类之间,一个类继承另一个类是说这个类属于另一个类,具有另一个类的所有属性和方法,同时它还可以有另一个类不具备的方法和属性。多态是建立在继承的基础上的,一个父类对象可以产生多个不同的子类对象,根据这些子类对象的不同可以具备不同的方法,也就是说表现出了不同的...

hellocsz的博客 2万+

西门子G120变频器在立体仓库堆垛机应用参数设置

本文详细介绍了G120 CU240E及CU250S变频器的参数设置流程。主要内容包括:1)快速调试步骤,从新建项目、扫描节点到设置电机类型、负载类型等参数;2)抱闸参数设置方法;3)参数下载异常时的处理方案。重点说明了通过STARTER软件进行向导式调试的完整过程,包括电机铭牌参数输入、识别方式选择等关键环节,并提示了通讯连接注意事项。当下载失败时,提供了通过导入导出项目文件解决问题的具体方法。

xdpcxq的专栏 864

达梦数据库修改最大连接数

达梦数据库的最大连接数推荐配置与服务器内存有关。不应设置得过大,否则容易导致出现OOM。文件中整型的参数值。DSC环境下,除了特殊参数以外,其他参数值会在OK节点上同步。返回值:当前DM.INI文件中对应的参数值。功能说明:返回DM.INI文件中。:DM.INI文件中的参数名。

Sebastien23的博客 3338

面向对象的三大特性:封装、继承、多态

封装、继承和多态是面向对象编程中的三大核心特性。它们在Java中起着重要的作用,使得代码更加模块化、可扩展和可维护。本文将介绍封装、继承和多态的概念、原理以及在Java开发中的应用场景。

恋上、小幸福的博客 6073

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

封装,继承和多态详解

C++面向对象的三大核心:封装,继承和多态.

行到水穷处,坐看云起时。 1732

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

封装、继承和多态

封装就是对类内部的实现细节进行隐藏,然后对类外提供公开的接口。继承其实是父类对子类的共性的抽取, 实现代码的复用。一个引用调用同一个方法,因为这个引用 引用的对象不一样,导致调用这个方法,所表现出来的行为不一样。这种思想就叫做多态。 ...

crazy_xieyi的博客 2473

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

面向对象的三大特征(封装、继承、多态)

封装继承和多态

yu的博客 3万+

c++:封装、继承、多态

封装是面向对象编程中的一种重要概念,它将数据和操作封装在一起,形成一个“黑盒子”,对外部只暴露必要的接口,隐藏内部实现细节。C++通过类(Class)来实现封装,其中包括私有成员(Private)、保护成员(Protected)和公有成员(Public)等访问控制修饰符。私有成员只能在类内部访问,保护成员可以在类及其子类中访问,公有成员可以在任何地方访问。首先,在介绍封装前,应该要知道类和对象这么一个事,什么是类和对象?

嵌入式小企鹅的博客 4151

最新面试必问:聊聊封装、继承、多态三大特性 【Java基础篇】

封装,就是将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过该对象对外提供的接口来访问该对象。

Java后端架构V 2053

万字总结,一文带你秒懂Java中的封装、继承和多态(有代码 有示例)

本文对Java语言中的封装、继承和多态,进行了详细的介绍以及解释说明。拓展了与之相关的诸多知识点,详细介绍了三大特性的作用,以及如何实现,对底层原理进行了通俗易懂的解释。

Xx_bjpyy的博客 2738
上一篇: 教你如何应对面试官提问你Redis 缓存数据库一致性时
下一篇: 看完你就能知道Java 线程栈虚拟内存在Windows 中是如何释放的
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值