覆盖与隐藏的区别 (一个列子)

本文通过一个具体的Java代码示例解释了隐藏与覆盖的概念。详细介绍了如何在Java继承体系中实现方法覆盖与变量隐藏,并展示了运行时多态的具体表现形式。

例子:

class Student1{
 int math = 70;
 static int computer = 80;
 int english = 65;
 public Student1(){
    study();
    exercise();
 }
 public void study(){
     System.out.println("Student.study:每位学生都在认真学习");
  }
 public static void exercise(){
    System.out.println("Student.exercise:所有学生都在做练习");
 }
}

class Graduate1 extends Student1{
 int math = 93;
 int computer = 99;
 static int english = 85;
 
 public Graduate1(){
    study();
    exercise();
 }
 public void study(){
    System.out.println("Graduate.study:每位研究生都在认真学习");
 }
 public static void exercise(){
    System.out.println("Graduate.exercise:所有研究生都在做练习");
 }
 public static void main() {
  Student1 s = new Graduate1();
  System.out.println();
  Graduate1 g = new Graduate1();
  System.out.print(s.math);
  System.out.print("\t");
  System.out.print(s.computer);
  System.out.print("\t");
  System.out.println(s.english);
  System.out.print(g.math);
  System.out.print("\t");
  System.out.print(g.computer);
  System.out.print("\t");
  System.out.println(g.english);
 }
}

1. 隐藏与覆盖类方法

    在讲清这个问题之前,先明白什么是隐藏?什么是覆盖?

    所谓隐藏,是指运行时系统调用当前对象引用的编译时类型中定义的方法;对于覆盖,则指运行时系统调用当前对象引用运行时类型中定义的方法。

    所以在执行Student1 s = new Graduate1();和Graduate1 g = new Graduate1();时,(1)先进行Student1类的构造,这里包括两个方法study()和exercise(),由于study()方法被覆盖,所以先执行Graduate1里study(),再执行Student1里的exercise();(2)再进行Graduate1类的构造,同样包括两个方法study()和exercise(),所以执行顺序为先Graduate1里的study()方法,再Graduate1里的exercise()方法。

2. 隐藏与覆盖成员变量

    如果子类中的变量和父类中的变量具有相同的名字,那么子类中的变量就会隐藏父类中的变量,不管他们的类型是什么,也不管他们是类变量还是实例变量。

   所以在执行诸如System.out.print(s.math);之类的s实例的程序时,显示为Student1类的成员变量,而执行诸如System.out.print(g.math);之类的g实例的程序时,显示为Graduate1类的成员变量。

答案:

Graduate.study:每位研究生都在认真学习
Student.exercise:所有学生都在做练习
Graduate.study:每位研究生都在认真学习
Graduate.exercise:所有研究生都在做练习

Graduate.study:每位研究生都在认真学习
Student.exercise:所有学生都在做练习
Graduate.study:每位研究生都在认真学习
Graduate.exercise:所有研究生都在做练习
70 80 65
93 99 85

转载于:https://www.cnblogs.com/jiangyi666/p/5754375.html

任务描述 本关任务:使用pytorch搭建出卷积神经网络并对手写数字进行识别。 相关知识 为了完成本关任务,你需要掌握:1.卷积神经网络,2.pytorch构建卷积神经网络项目流程。 卷积神经网络 为什么使用卷积神经网络 卷积神经网络最早主要用来处理图像信息。如果用全连接前馈网络来处理图像时,会存在以下两个问题: 参数太多:如果输入图像大小为100 × 100 × 3。在全连接前馈网络中,第一个隐藏层的每个神经元到输入层都有 30000个相互独立的连接,每个连接都对应一个权重参数。随着隐藏层神经元数量的增多,参数的规模也会急剧增加。这会导致整个神经网络的训练效率会非常低,也很容易出现过拟合。 局部不变性特征: 自然图像中的物体都具有局部不变性特征,比如在尺度缩放、平移、旋转等操作不影响其语义信息。而全连接前馈网络很难提取这些局部不变特征,一般需要进行数据增强来提高性能。 卷积神经网络是一种具有局部连接、 权重共享等特性的深层前馈神经网络。想要识别图像中的物体,就需要提取出比较好的特征,该特征应能很好地描述想要识别的物体。所以物体的特征提取是一项非常重要的工作。而图像中物体的特征以下几种特点: 1.物体的特征可能只占图像中的一小部分。比如下图中狗的鼻子只是图像中很小的一部分。 2.同样的特征可能出现在不同图像中的不同位置,比如下图中狗的鼻子在两幅图中出现的位置不同。 3.缩放图像的大小对物体特征的影响可能不大,比如下图是缩小后的图,但依然能很清楚的辨认出狗的鼻子。 而卷积神经网络中的卷积池化操作能够较好地抓住物体特征的以上3种特点。 卷积 卷积说白了就是有一个卷积核(其实就是一个带权值的滑动窗口)在图像上从左到右,从上到下地扫描,每次扫描的时候都会将卷积核里的值所构成的矩阵图像被卷积核覆盖的像素值矩阵做内积。整个过程如下图所示,其中黄色方框代表卷积核,绿色部分代表单通道图像,红色部分代表卷积计算后的结果,通常称为特征图: 那为什么说卷积能够提取图像中物体的特征呢?其实很好理解,上图中的卷积核中值的分布如下: 当这个卷积核卷积的时候就会在3行3列的小范围内计算出图像中几乎所有的3行3列子图像卷积核的相似程度(也就是内积的计算结果)。相似程度越高说明该区域中的像素值卷积核越相似。(上图的特征图中值为4的位置所对应到的源图像子区域中像素值的分布卷积核值的分布最为接近)这也就说明了卷积在提取特征时能够考虑到特征可能只占图像的一小部分,以及同样的特征可能出现在不同的图像中不同的位置这两个特点。 PS:卷积核的值是怎么确定下来的?很明显是训练出来的! 池化 池化就是将输入图像进行缩小,减少像素信息,只保留重要信息。 池化的操作也很简单,通常情况下,池化区域是2行2列的大小,然后按一定规则转换成相应的值,例如最常用的最大池化(max pooling)。最大池化保留了每一小块内的最大值,也就是相当于保留了这一块最佳的匹配结果。举个例子,如下图中图像是4行4列的,池化区域是2行2列的,所以最终池化后的特征图是2行2列的。图像中粉色区域最大的值是6,所以池化后特征图中粉色位置的值是6,图像中绿色区域最大的值是8,所以池化后特征图中绿色位置的值是8,以此类推。 从上图可以看出,最大池化不仅仅缩小了图像的大小,减少后续卷积的计算量,而且保留了最佳的特征(如果图像是经过卷积后的特征图)。也就相当于把图缩小了,但主要特征还在,这就考虑到了缩放图像的大小对物体的特征影响可能不大的特点。 全连接网络 卷积池化能够很好的提取图像中物体的特征,当提取好特征之后就可以着手开始使用全连接网络来进行分类了。全连接网络的大致结构如下: 其中输入层通常指的是对图像进行卷积,池化等计算之后并进行扁平后的特征图。隐藏层中每个方块代表一个神经元,每一个神经元可以看成是一个很简单的线性分类器和激活函数的组合。输出层中神经元的数量一般为标签类别的数量,激活函数为softmax(因为将该图像是猫或者狗的得分进行概率化)。因此我们可以讲全连接网络理解成很多个简单的分类器的组合,来构建成一个非常强大的分类器。 卷积神经网络大致结构 将卷积,池化,全连接网络进行合理的组合,就能构建出属于自己的神经网络来识别图像中是猫还是狗。通常来说卷积,池化可以多叠加几层用来提取特征,然后接上一个全连接网络来进行分类。大致结构如下: pytorch构建卷积神经网络项目流程 数据集介绍加载数据 本次使用数据集为mnist手写数字数据集,简单来讲就是如下的东西: 数据集分为训练集测试集,训练集中一共有60000张图片,测试集中一共有10000张图片,每张图片大小为28X28x1。图片标签为对应的数字,如8对
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值