多态

什么是多态?为什么要使用多态?什么时候用多态?多态是如何实现的?使用多态有什么好处?   在学习《大话设计模式》的时候经常会遇到多态,但什么是多态?为什么要使用多态?什么时候用多塔?多态是如何实现的?使用多态有什么好处?我们将根据以上五个问题展开激烈的讨论。 什么是多态?   多态,顾名思义指“多种形态”。多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。 例:猪、狗、猫都属于动物类,我们将动物类作为父类,猪“哼哼叫”,狗“汪汪叫”,猫“喵喵叫”,猪、狗、猫三... 阅读详情
不请自来,C++的多态不太清楚。java比较熟悉,就说说咯。
用一句话概括就是:事物在运行过程中存在不同的状态。先以教科书般举例说明,下文再举一个花木兰替父从军的例子帮助大家理解. 多态的存在有三个前提:
1.要有继承关系
2.子类要重写父类的方法
3.父类引用指向子类对,
但是其中又有很多细节需要注意。首先我们定义两个类,一个父类Animal,一个子类Cat。
父类Animal
class Animal {
	int num = 10;
	static int age = 20;
	public void eat() {
		System.out.println("动物吃饭");
	}
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">sleep</span><span class="o">()</span> <span class="o">{</span>
	<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"动物在睡觉"</span><span class="o">);</span>
<span class="o">}</span>

<span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">(){</span>
	<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"动物在奔跑"</span><span class="o">);</span>
<span class="o">}</span>

}

子类Cat

class Cat extends Animal {
int num = 80;
static int age = 90;
String name = “tomCat”;
public void eat() {
System.out.println(“猫吃饭”);
}
public static void sleep() {
System.out.println(“猫在睡觉”);
}
public void catchMouse() {
System.out.println(“猫在抓老鼠”);
}

}
测试类Demo_Test1

class Demo_Test1 {
public static void main(String[] args) {
Animal am = new Cat();
am.eat();
am.sleep();
am.run();
//am.catchMouse();这里先注释掉,等会会说明
//System.out.println(am.name);//这里先注释,待会说明
System.out.println(am.num);
System.out.println(am.age);
}
}
以上的三段代码充分体现了多态的三个前提,即:
1、存在继承关系
Cat类继承了Animal类
2、子类要重写父类的方法
子类重写(override)了父类的两个成员方法eat(),sleep()。其中eat()是非静态的,sleep()是静态的(static)。
3、父类数据类型的引用指向子类对象。
测试类Demo_Test1中 Animal am = new Cat();语句在堆内存中开辟了子类(Cat)的对象,并把栈内存中的父类(Animal)的引用指向了这个Cat对象。
到此,满足了Java多态的的必要三个前提。
---------------------------------------------------华丽的分割线----------------------------------------------------------------------
如果再深究一点呢,我们可以看看上面测试类的输出结果,或许对多态会有更深层次的认识。猜一猜上面的结果是什么。
<img src=“ https://pic1.zhimg.com/50/521db7a41065f92441a95b0ff294e707_hd.jpg” data-rawwidth=“671” data-rawheight=“133” class=“origin_image zh-lightbox-thumb” width=“671” data-original=“ https://pic1.zhimg.com/521db7a41065f92441a95b0ff294e707_r.jpg”/>
可以看出来
子类Cat重写了父类Animal的非静态成员方法am.eat();的输出结果为:猫吃饭。
子类重写了父类(Animal)的静态成员方法am.sleep();的输出结果为:动物在睡觉
未被子类(Cat)重写的父类(Animal)方法am.run()输出结果为:动物在奔跑
System.out.println(am.num);//输出结果为10
System.out.println(am.age);//输出结果为20
那么我们可以根据以上情况总结出多态成员访问的特点:
成员变量
编译看左边(父类),运行看左边(父类)
成员方法
编译看左边(父类),运行看右边(子类)。动态绑定
静态方法
编译看左边(父类),运行看左边(父类)。
(静态和类相关,算不上重写,所以,访问还是左边的)
只有非静态的成员方法,编译看左边,运行看右边
---------------------------------------------------华丽的分割线----------------------------------------------------------------------
那么多态有什么弊端呢?有的,即多态后不能使用子类特有的属性和方法。往上面的代码看,子类Cat有一个特有的属性String name = “tomCat”; 并且还有一个特有的抓老鼠的方法catchMouse()。但是在测试类(Demo_Test)中,我们尝试调用子类特有的方法catchMouse()和打印子类特有的成员属性String name = “tomCat”; 就会报错。
am.catchMouse();
System.out.println(am.name);
<img src=“ https://pic3.zhimg.com/50/a44f349a4179695f223c683d4eddb8a6_hd.jpg” data-rawwidth=“302” data-rawheight=“223” class=“content_image” width=“302”/>
原因就是多态的弊端,就是:不能使用子类特有的成员属性和子类特有的成员方法。
--------------------------------------------------华丽的分割线----------------------------------------------------------------------
如果在代码执行过程中还想使用Cat类中特有的属性String name和它特有的成员方法catchMouse()了怎么办呢?那我们就可以把这个父类引用指向了子类对象的家伙am再强制变回Cat类型。这样am就是Cat类型的引用了,指向的也是Cat对象了,自然也能使用Cat类的一切属性和一切的成员方法。
class Demo_Test {
public static void main(String[] args) {

<span class="n">Animal</span> <span class="n">am</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Cat</span><span class="o">();</span>
<span class="n">am</span><span class="o">.</span><span class="na">eat</span><span class="o">();</span>
<span class="n">am</span><span class="o">.</span><span class="na">sleep</span><span class="o">();</span>
<span class="n">am</span><span class="o">.</span><span class="na">run</span><span class="o">();</span>

// am.catchMouse();
// System.out.println(am.name);
System.out.println(am.num);
System.out.println(am.age);

<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"------------------------------"</span><span class="o">);</span>
<span class="n">Cat</span> <span class="n">ct</span> <span class="o">=</span> <span class="o">(</span><span class="n">Cat</span><span class="o">)</span><span class="n">am</span><span class="o">;</span>
<span class="n">ct</span><span class="o">.</span><span class="na">eat</span><span class="o">();</span>
<span class="n">ct</span><span class="o">.</span><span class="na">sleep</span><span class="o">();</span>
<span class="n">ct</span><span class="o">.</span><span class="na">run</span><span class="o">();</span>
<span class="n">ct</span><span class="o">.</span><span class="na">catchMouse</span><span class="o">();</span>
<span class="o">}</span>        

}

<img src=“ https://pic4.zhimg.com/50/b224f6fa488db52088f02d500677448a_hd.jpg” data-rawwidth=“677” data-rawheight=“234” class=“origin_image zh-lightbox-thumb” width=“677” data-original=“ https://pic4.zhimg.com/b224f6fa488db52088f02d500677448a_r.jpg”/>
很明显,执行强转语句Cat ct = (Cat)am;之后,ct就指向最开始在堆内存中创建的那个Cat类型的对象了。这就是多态的魅力吧,虽然它有缺点,但是它确实十分灵活,减少多余对象的创建,不用说为了使用子类的某个方法又去重新再堆内存中开辟一个新的子类对象。以上。。
----------------------------------------------------------分割线------------------------------------------------------------------------
啦啦啦,收到这么多赞.很惊讶,举个通俗点的例子吧.
花木兰替父从军
大家都知道花木兰替父从军的例子,花木兰替父亲花弧从军。那么这时候花木兰是子类,花弧是父类。花弧有自己的成员属性年龄,姓名,性别。花木兰也有这些属性,但是很明显二者的属性完全不一样。花弧有自己的非静态成员方法‘骑马杀敌’,同样花木兰也遗传了父亲一样的方法‘骑马杀敌’。花弧还有一个静态方法‘自我介绍’,每个人都可以问花弧姓甚名谁。同时花木兰还有一个自己特有的非静态成员方法‘涂脂抹粉’。但是,现在花木兰替父从军,女扮男装。这时候相当于父类的引用(花弧这个名字)指向了子类对象(花木兰这个人),那么在其他类(其他的人)中访问子类对象(花木兰这个人)的成员属性(姓名,年龄,性别)时,其实看到的都是花木兰她父亲的名字(花弧)、年龄(60岁)、性别(男)。当访问子类对象(花木兰这个人)的非静态成员方法(骑马打仗)时,其实都是看到花木兰自己运用十八般武艺在骑马打仗。当访问花木兰的静态方法时(自我介绍),花木兰自己都是用她父亲的名字信息在向别人作自我介绍。并且这时候花木兰不能使用自己特有的成员方法‘涂脂抹粉’。 -----多态中的向上转型
那么终于一将功成万骨枯,打仗旗开得胜了,花木兰告别了战争生活。有一天,遇到了自己心爱的男人,这时候爱情的力量将父类对象的引用(花弧这个名字)强制转换为子类对象本来的引用(花木兰这个名字),那么花木兰又从新成为了她自己,这时候她完全是她自己了。名字是花木兰,年龄是28,性别是女,打仗依然那样生猛女汉子,自我介绍则堂堂正正地告诉别人我叫花木兰。OMG!终于,终于可以使用自己特有的成员方法‘涂脂抹粉’了。从此,花木兰完全回到了替父从军前的那个花木兰了。并且和自己心爱的男人幸福的过完了一生。 -----多态中的向下转型
----------------------------------------------------------华丽的分割线---------------------------------------------------------------
大家记得哈,向上转型向下转型一定是在多态这个前提下哈,否则强制将女儿变成父亲,或者将父亲变成女人,就变成东方不败了,系统此时就会报错非法类型转换。哈哈哈哈哈。另外开发中一般是利用多态声明形式参数,并将创建子类的匿名对象作为实际参数。以上。

【大语言模型 37】知识蒸馏深度实战:大模型向小模型迁移 本文深入探讨了知识蒸馏技术在大语言模型领域的应用,详细阐述了如何将庞大复杂的大模型知识有效迁移到轻量级小模型中。文章系统介绍了知识蒸馏的理论基础、多种蒸馏损失函数设计、特征匹配与注意力迁移技术、渐进式蒸馏策略以及全面的效果评估方法。通过实战案例和完整代码实现,读者将掌握从理论到实践的知识蒸馏全流程,了解如何在保持模型性能的同时显著降低计算资源需求,实现大语言模型的高效部署与应用。 阅读详情

相关推荐

概率数据关联(PDA):多目标跟踪的基石算法

1. 为什么需要概率数据关联? 2. 核心思想与假设条件 3. 算法核心:概率分配与状态更新 4. 典型应用场景与优势 5. 挑战与改进方向 6. 下期预告

qq_44965657的博客 1464

JAVA多态之编译时看左边,运行时看右边

在编译时,编译器只考虑animal的类型为Animal,因此只能调用Animal类中的say()方法。但是,由于实际上animal是一个Dog对象,因此在运行时会调用Dog类中的say()方法。因此,多态的运行时行为取决于对象的实际类型,而不是引用变量的类型。这是一个常见的多态描述。它表示在编译时,编译器只考虑左边(即引用变量的类型),而在运行时,实际调用的方法是由右边(即对象的实际类型)决定的。

这介绍不了我 1195

高德地图爬虫

高德地图爬虫 工具:Pycharm,win10,Python3.6.4 1.需求分析 这篇爬虫和上一篇百度地图爬虫要求一样,百度地图爬虫我发现有一个auth参数会一直变化,一旦变化则获取的数据是不准确的,所以我上高德地图看了一下,高德地图没有这个反爬机制。但是高德地图大概爬取120个页面就会跳一次验证码,我这里是通过换IP解决这个问题的。 2.数据准备 同样我们需要全国地级市信息,用之前...

123的博客 1万+

什么是多态,多态的实现方法是什么?

作者:程序狗链接:https://www.zhihu.com/question/30082151/answer/120520568来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 用一句话概括就是:事物在运行过程中存在不同的状态。先以教科书般举例说明,下文再举一个花木兰替父从军的例子帮助大家理解. 多态的存在有三个前提:1.要有继承关系2.子类要重写父类的方法3...

weixin_30706691的博客 936

一分钟理解 AP(Affinity Propagation) 亲和⼒传播算法

这篇博客发出来后,我用 Rust 复现代码出现问题。为此,我对对照了 sklearn 的相关代码,反复比较了两天,发现一处 bug,把 += 误写成了 =,导致数据量大的时候完全无法聚类。这个debug过程让我仔细梳理的 AP 算法的计算过程,今天我对这篇博客做了大规模修改,以便能原样展现原论文思想。

程序猿视角 3219

CoMP 协同多点传输技术

CoMP CoMP是什么 解决什么问题 有什么缺点 CoMP(Coordinated Multiple Points)协同多点传输,通信术语,LTE-A的重要技术之一。 CoMP传输是指地理位置上分离的多个传输点,协同参与为一个终端的数据(PDSCH)传输或者联合接收一个终端发送的数据(PUSCH),参与协作的多个传输点通常指不同小区的基站。CoMP技术将边缘用户置于几个基站的同频率上,几...

ilean_J的博客 2万+

Java 面试题 021 - 030

021、成员变量和局部变量的区别? 成员变量可以被访问控制修饰符及 static 修饰,但局部变量不可以。 成员变量是对象的一部分,随着对象的创建而存在,局部变量随着方法的调用而存在,方法调用结束也就随之销毁了。 成员变量一般跟随对象存储在堆中,局部变量存储在栈内存中。 022、一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么? 构造方法的主要作用是完成实例对象的初始化工作。 一个类即使没有声明任何构造方法,该程序也可以正确执行,因为在没有显示声明任何构造方法的情况

明月燃雨 552

在Ubuntu 20.04上,用EtherCAT Igh 1.6.2驱动高创BD3E伺服电机(附完整C代码)

本文详细介绍了在Ubuntu 20.04实时内核环境下,使用EtherCAT Igh 1.6.2主站驱动高创BD3E伺服电机的完整实现方案。从实时系统配置、伺服电机PDO映射到精确控制线程设计,提供了完整的C代码样例和实际项目中的调试技巧,帮助开发者实现工业自动化中的高精度运动控制。

weixin_30772105的博客 110

C++ 多态问题:为什么不直接用子类引用子类,而是用父类指针指向子类

刚开始的时候对于这个问题我一直搞不明白,总觉得这是多此一举,后来上网查资料看到了一些人的解释明白了为什么要这样,用一个例子来解释应该最好理解了: 你写了一个飞机游戏,画面里出现什么类型飞机是随机决定的,你的代码里也就不可能用一个具体飞机类型来操作。 所以,往往是随机生成各种类型飞机,他们有共同的父类,你的代码就可以用父类指针来控制行为。比如中弹后的能量损失多少之类,每种飞机可能不同。 参考

marsggbo的博客 4526

SAC安装与相关库文件(.so)的安装

摘要 SAC: Seismic Analysis Code 是用于地震信号处理的一套软件。 本文将介绍SAC的安装,以及安装时遇到的一些问题。主要是一些动态库(lib**.so)找不到的问题。 本文的环境 64位的 Ubuntu 16.04 64位的系统是安装出现问题的主要原因 1. SAC获取与安装 SAC 的安装,只需要解压,然后修改环境变量即可!!!不需要任何编译!!! 1.1. SAC 获取与解压 SAC软件获取地址:http://ds.iris.edu/ds/nodes/dmc/forms/s.

WangCY的博客 4335

深度学习助力台风路径预测:技术剖析与实战应用全攻略(基于LSTM模型)

摘要:深度学习技术在台风路径预测领域展现出巨大潜力。通过融合多源气象数据,深度学习模型如LSTM能有效处理时间序列数据,捕捉台风路径变化规律。与传统方法相比,深度学习模型在自动特征学习和处理复杂模式方面具有独特优势,提高了预测的准确性和实时性。然而,挑战依然存在,包括数据质量问题、模型可解释性不足以及极端台风的复杂性。未来,随着观测技术的进步和新算法的开发,深度学习将在台风路径预测中发挥更大作用,为防灾减灾提供更精准的决策支持。

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

Java 编译看左边 运行看右边的理解

在理解Java动态的时候,有这么一句话 :编译看左边 , 运行看右边;那么又如何来理解呢?

weixin_44918567的博客 1646

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1904

什么是多态

目录 什么是多态 多态的特点 多态存在的三个必要条件 多态时成员变量、静态方法和非静态方法的特点 什么是多态 多态就是一个对象变量可以指向多种实际类型的现象,同一个事件发生在不同的对象上会产生不同的结果。 多态的特点 好处:消除类型之间的耦合关系 弊端:不能用子类方法,可用转型的方法解决 转型: ·向上转型:【自动】父类 父类对象 = 子类实例; Fu f...

weixin_43827227的博客 1万+

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java中编译时多态与运行时多态

文章目录1. 什么是多态2. 编译时多态3. 运行时多态总结Reference 口诀:成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边 当父类变量引用子类对象时(Father f = new Son();),在这个引用变量f指向的对象中,它的成员变量和静态方法与父类是一致的,他的非静态方法,在编译时是与父类一致的,运行时却与子类一致(发生了复写) 1. 什么是多态 多态是指允许不同子类型的对象对同一行为作出不同的响应。例如在生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞

xylitolz的博客 9381

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++多态——静态多态与动态多态

多态:顾名思义,多态就是多种形态,也就是对不同对象发送同一个消息,不同对象会做出不同的响应。并且多态分为静态多态和动态多态。静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,例如:函数的重载,对象名加点操作符执行成员函数等,都是静态多态,其中,重载是在形成符号表的时候,对函数名做了区分,从而确定了程序执行到这里将要执行哪个函数,对象名加点操作符执行成员函数是通过this指针来调用的

stay_the_course的博客 1万+

IEM模型,地表粗糙度模拟

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

java 多态的应用——多态数组和多态参数详解

java 多态的应用——多态参数和多态数组内容分享,本篇博文为java 面向对象三大特性——多态篇的补充。

优快云 / 稀土掘金/ B站 / GitHub: Cyan_RA9 3837

多态 静态多态 动态多态

抽象类提供一个框架,强制子类实现特定的功能。

weixin_43490759的博客 2936

C++ 多态全解析:静态多态与动态多态详解

本文将系统梳理多态的定义、官方权威解释、静态与动态多态的区别、典型代码与注意事项,帮助你彻底搞懂C++多态。

Darker的博客 2325

多态性

多态性 多态性的概念 派生一个类的原因并非总是为了继承或添加新成员,有时是为了重新定义基类的成员,使基类成员“获得新生” 面向对象程序设计的真正力量不仅仅是继承,而是允许派生类对象像基类对象一样处理,其核心机制就是多态和动态联编 多态是指同样的消息被不同类型的对象接收时导致不同的行为。所谓消息是指对类成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数 从广义上说,多态性是指一段程序能够处理多种类型对象的能力 在C++中,这种多态性可以通过重载多态(函数和运算符重载),强制多态(类型强制转换),

weixin_51958878的博客 5264

Java多态:多态多态,多种形态

Java多态:灵活处理对象的行为展现机制

子夜的个人博客 1742

面向对象设计领域中的参数多态,包含多态,过载多态和强制多态

在面向对象设计中,多态性是一个重要的概念,它允许我们以一种统一的方式处理不同类型的对象,并根据对象的实际类型来执行相应的行为。通过将具体的对象看作是其父类或接口的实例,并在方法调用时根据实际的对象类型来确定具体的执行逻辑,我们可以以一种统一的方式处理不同类型的对象。- 当方法需要操作的对象类型不确定时,可以使用多态来接受不同类型的对象,减少代码的重复。使用场景: - 当需要执行类似的操作,但操作的参数类型或个数可能不同时,可以使用过载多态来定义多个方法,使得代码更清晰、简洁,并提高代码的可读性。

辣香牛肉面的博客 1468

参数多态、包含多态、过载多态和强制多态

多态分为两种:通用的多态和特定的多态。两者的区别是前者对工作的类型不加限制,允许对不同类型的值执行相同的代码;后者只对有限数量的类型有效,而且对不同类型的值可能要执行不同的代码。     通用多态又分为参数多态(parametric)和包含多态(Inclusion Polymorphism);特定多态分为过载多态(overloading)和强制多态(coercion)。     强制多态(

飞老虎 1万+

静态多态和动态多态的区别

#include <iostream> using namespace std; class A { public: virtual void function() { cout << "I am A" << endl; } }; class B :public A { public: void function() { cout << "I used to be A but now I am B" << endl; } void fun

weixin_45027171的博客 6919

多态以及多态底层的实现原理

1.必须是基类的指针或者引用去调用虚函数2.虚函数必须完成了重写或者覆盖因为我们前面所将的切片的类型兼容转换,只有基类的指针或者引用才能即指向基类对象又指向派生类对象.虚函数的重写或者覆盖所指的是它的实现重写,这样基类和派生类才能有不同的函数.才能实现多态.class Apublic:public:int main()ptr1->a();ptr2->a();return 0;以上就是多态的实现.

20 • backend dev • building things that just work • learning systems & low level stuff • love video games 943

编译时多态和运行时多态

编译时多态和运行时多态 多态分为两种情况:编译时多态和运行时多态。如果在编译时能够确定执行多态方法称为编译时多态,否则称为运行时多态。 一、编译时多态 方法重载都是编译时多态。根据实际参数的数据类型、个数和次序,Java在编译时能够确定执行重载方法。 方法覆盖表现出两种多态性,当对象引用本类实例时,为编译时多态,否则为运行时多态。例如,以下声明p、m引用本类实例,调用toString()方法是编译时多态。 public class Test { public static void

twx31420的博客 4997
上一篇: 抽象类和接口区别
下一篇: android 手机一边录音一边播放 仿yy的试听功能
SATTSA
博客等级 码龄8年 9粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值