首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

5.1 类、超类和子类

5.1 类、超类和子类   子类比超类拥有的功能更加丰富。   在本例中,Manager类比超类Employee封装了更多的数据,拥有更多的功能。   ...从超类中还继承了name、salary和hireDay这3个域,所以现在就有了4个域(由于增加了bonus域)。   ...在通过扩展超类定义子类的时候,仅需要指出子类和超类的不同之处,因此,会将通用的方法放在超类中,而将具有特殊用途的方法放在子类中,这种将通用的功能放在超类的方法,在面向对象程序设计中十分普遍。   ...可以将一个子类变量赋给一个超类变量,但不能将一个超类变量赋给一个子类变量。 5.1.3 动态绑定   调用方法的过程可以分解为:   (1)编译器查看对象的声明类型和方法名。...从某种角度看,祖先类更加通用,人们只将它作为派生其他类的基类,而不作为想使用的特定的实例类。 ?   学生和雇员都有姓名属性,因此可以将getName方法放置在继承关系较高层次的通用超类中。

1.1K90

面向对象程序设计中“超类”和“子类”概念的来历

众所周知,在面向对象程序设计中,子类从超类中继承数据成员和成员方法,然后在此基础上再根据实际需要进行扩展并增加属于子类的数据成员和成员方法。...也就是说,子类的对象比超类的对象具有更加丰富的属性,或者具有更多的行为。或者说,子类的功能比超类的功能更加强大。那么为什么不把子类叫做超类呢? ?...实际上,超类和子类的概念来自于集合论,借鉴了超集和子集的概念。子集中的所有元素都属于其超集,而超集中并不是所有元素都属于子集。...同理,在面向对象程序设计中,所有子类对象都属于其超类的实例,而反过来则是不成立的。 ?

1.5K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢

    比如可以将一个Integer类型的对象分配给Object类型的对象,因为Object 是Integer的超类。...尽管Integer是Number的子类型,但Box 和Box不是Box的子类,它俩的父类对象是Object。文首的对话表达的就是这个意思。...那么问题来了,当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类型的对象是如何实现子类型化的吧。...小结:可以通过继承泛型类或者实现接口来对其进行子类型化。 搞懂了子类型化的问题,我们回到“如何在两个泛型类之间创建类似子类型的关系“的问题。

    2.9K20

    Js如何利用prototype为类创建静态成员属性和方法

    前言 为类创建静态成员,是面向对象语言的特点,js是可以通过prototype来实现这一特点 01 具体代码如下所示 // 用function 模拟一个类出来,同时也作为构造函数 function MyClass...() { this.name = "https://coder.itclan.cn"; // 类的成员变量name this.myStaticFun = myStaticFun; //...类的成员函数,把私有函数放到外头,避免重复创建 } // 把私有函数抽离出来 function myStaticFun() { return this.name; } // 为MyClass...如果还没有找到,会继续往上找,也就是Object顶级对象,要是还没有,那就会返回undefined 分析 prototype是js为每一个对象内置的隐藏属性,它会随着这个对象一直存在,当构造函数内的私有属性和私有方法与构造器函数原型下的属性和方法同名时...私有属性和方法要优先于共有属性 在上面的示例中,在构造器函数内定义了一个私有属性和方法,但同时也创建定义了共有属性和方法,定义在MyClass上,通过new语句实例化后,对象就有prototype的所有属性

    1.9K30

    【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南

    C++ 日期类实现详解 前言 在本篇博客中,我们将一步一步讲解如何实现一个 C++ 的日期类(Date)。通过这一项目,你将巩固类与对象的基础知识、构造函数的使用、运算符重载、日期计算等内容。...在阅读本篇前,需要有一定C++类和对象的基础 请见:C++类与对象深度解析(一):从抽象到实践的全面入门指南等六篇类和对象系列文章 1....加法与减法运算 在这一部分,我们将探讨如何实现日期的加法与减法,包括对日期对象加上指定的天数或从日期对象中减去天数。...写在最后 在这篇博客中,我们深入探讨了如何通过 C++实现一个功能完善的日期类。...以上就是关于【C++篇】C++类和对象实践篇——从零带你实现日期类超详细指南的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️

    10710

    从 Java 代码如何运行聊到 JVM 和对象的创建-分配-定位-布局-垃圾回收

    看下图理解 Java 代码如何运行: 概括一下:程序员小张编写好的 Java 源代码文件经过 Java 编译器编译成字节码文件后,通过类加载器加载到内存中,才能被实例化,然后到 Java 虚拟机中解释执行...具体的 javac 编译和类加载器过程请见下图: 本文主要介绍 JVM 内存模型、参数设置说明、对象创建过程解析、初始 GC。下面请大家进入正题吧 JVM 内存布局是什么样的呢?...,在什么地方分配内存,又是如何分配的,对象是如何定位的,以及对象的内存布局,最后又是如何回收的。...1)对象的创建 先在虚拟机栈创建栈帧,栈帧内创建对象的引用,在方法区进行类的加载,然后去 Java 堆区进行分配内存并内存初始化,再回到栈帧中初始化对象的数据,完成对象的创建。...这个 TLAB 和 Java 中的 ThreadLocal 类有点像,每个线程独享线程本地变量。 哪个线程需要分配内存先去各自的 TLAB 中分配,但是这个缓冲区比较小,是为了加速对象的分配。

    2.8K20

    从基础入门到学穿C++(类和对象篇)【超详细】【一站式速通】

    类和对象 C语言是一种面向过程的语言,C++和python、java一样都是一种面向对象的语言。...和private修饰的成员在类外面不可以直接被访问(protected和private其实有一定的区别,后期再做区分) 2.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止 3....类存储数据的策略 代码只保存一份,在对象中保存存放代码的地址 只保存成员变量,成员函数存放在公共的代码段 如何计算对象的大小 计算成员变量之和,并且考虑内存对齐(结构体内存对齐知识),类似于结构体。...,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。...内置类型是编译器自己定义的,所以它知道如何比较大小,但是比较自定义类型的时候,编译没办法进行,类型是我们自己定义的,编译器并不知道比较的规则,所以我们需要自己进行定义。

    9610

    JavaScript继承与聚合

    一,继承 第一种方式:类与被继承类直接耦合度高 1,首先,准备一个可以被继承的类(父类),例如 //创建一个人员类 function Person(name) {//现在Person里面的域是由...*/ //subClass:子类 superClass:超类(2) function extend(subClass,superClass) { //1,使子类原型属性等于父类的原型属性...superClass ==》原型链的引用 subClass.superClass = superClass.prototype; //4,增加一个保险,就算你的原型类是超类...} } } 3,接受聚合的类(受体) var get={name:"Text",age:20}; 4,实现将JSON类的方法聚合到类get中 mixin(get,JSON);/...受体) var o=function () { this.name="聚合"; this.age=19; } 4,实现JSON类到o类的聚合(将JSON类中的方法聚合到o类中) mixin(o,JSON

    71940

    关键字触发器定义,扩展数据块,类关键字Abstract,ClassType

    详解如果一个类是抽象的,就不能创建它的实例。对子类的影响此关键字不是继承的。默认如果省略这个关键字,这个类就不是抽象的。第十二章 类关键字 - ClassType指定此类的类型(或行为)。...index —该类是一个索引类,一个定义索引接口的专用类。空字符串,表示此类没有特定类型。抽象类通常不指定类类型。如果未指定此关键字,则类类型从主超类继承(如果有)。...详解此关键字指定如何使用此类。类别编译器使用类别类型关键字来决定如何编译类别。例如,如果ClassType是持久性的,则类编译器还会调用存储编译器来为类生成持久性代码。...除非明确定义,否则ClassType的值要么是默认值,要么是从主超类继承而来的。对于持久性类,只有在标准持久性行为被重写时,才需要显式的ClassType语句。...如果一个类定义包含这样的语句,要么是因为开发人员指定了它,要么是因为这个类起源于用旧版本的InterSystems IRIS开发的代码。对子类的影响这个关键字是从主超类继承的。子类可以覆盖关键字的值。

    79730

    继承、派生、新式类与经典类

    指新建类的方法,新建的类称之为子类或者派生类,子类继承的类叫做父类,也称之为基类或者超类。 继承特征: 子类可以继承父类的属性(特征与技能),并且可以派生出自己的属性(特征与技能)。...在python中一个子类可以继承多个父类,其他语言一个子类只可以继承一个父类 2.为什么要继承? 继承的目的是为了减少代码的冗余(减少重复代码) 3.如何实现继承?...派生指子类继承父类的属性,并且派生自己的属性。 如果子类和父类都有这个属性,以子类自己的属性为准。 继承指的是类与类的关系,子类与父类是从属关系。...——新式类——》广度优先:从左向右查找,和经典类的区别是最后找所有分支共同的父类 ?...继承指的是新建类的方法, 新建的类称之为子类或者派生类,子类继承的类叫做父类,也称之为基类或超类.

    57120

    Python中的__init__()方法整理中(两种解释)

    这个方法函数通常用来创建对象的实例变量并执行任何其他一次性处理。 下面是Card类示例定义的层次结构。我们将定义Card超类和三个子类,这三个子类是Card的变种。...,这样在Card超类中的通用初始化可以适用于三个子类NumberCard、AceCard和FaceCard。...这个方法函数通常用来创建对象的实例变量并执行任何其他一次性处理。 下面是Card类示例定义的层次结构。我们将定义Card超类和三个子类,这三个子类是Card的变种。...,这样在Card超类中的通用初始化可以适用于三个子类NumberCard、AceCard和FaceCard。...我们将在第9章的《序列化和存储——JSON、YAML、Pickle、CSV和XML》深入研究。 还要注意一些不完全遵循21点规则的方法功能。

    2.7K60

    Python中的__init__()方法整理中(两种解释)

    这个方法函数通常用来创建对象的实例变量并执行任何其他一次性处理。 下面是Card类示例定义的层次结构。我们将定义Card超类和三个子类,这三个子类是Card的变种。...,这样在Card超类中的通用初始化可以适用于三个子类NumberCard、AceCard和FaceCard。...这个方法函数通常用来创建对象的实例变量并执行任何其他一次性处理。 下面是Card类示例定义的层次结构。我们将定义Card超类和三个子类,这三个子类是Card的变种。...,这样在Card超类中的通用初始化可以适用于三个子类NumberCard、AceCard和FaceCard。...我们将在第9章的《序列化和存储——JSON、YAML、Pickle、CSV和XML》深入研究。 还要注意一些不完全遵循21点规则的方法功能。

    6.5K50

    Python基础:网络编程sockets

    1、它有一个基类,定义了如何建立连接。BaseServer提供了服务类接口,BaseServer使用了select创建了多线程。...2、它还提供了请求处理类:定义了如何处理用户数据。定义了三个方法setup\handler\finish,的接口,使用时,重新写对应方法。     ...3、使用Forktheard和 BaseServer模块结构: ? 服务处理类方法: 作用 BaseServer 超类,提供了API,并利用select创建了多线程。不能直接调用它使用。...如果需要,此功能可以创建新的进程或线程来处理请求,ForkingMixIn和ThreadingMixIn类做到这点。常用。server_activate()通过服务器的构造函数来激活服务器。...默认值通常为5 ,但可以被子类覆盖。socket_type 服务器使用的套接字类型,socket.SOCK_STREAM和socket.SOCK_DGRAM等。timeout 超时时间。

    48520

    设计模式之策略模式

    下面我们按照上面的需求来设计我们相关的类,虽然新闻和电影有不同的打包流程,但我们分析后知道,除了生成json文件(数据不同)和自动上传功能不同外,其他的流程是可以公用的,那么按照面向对象的思想,我们应该设计出一个超类...,将新闻和电影两个模块中相同的打包流程,在超类中实现,将两个模块不同的打包流程设计成抽象方法让它们的子类去实现,这样就可以将相同的打包流程复用了。...既然我们已经知道了要把生成json文件和自动上传功能要分离,那我们到底要怎么分离呢,也就是我们到底创建相关的类分离还是接口分离呢?...既然我们知道应该针对接口编程,那么我们需要把生成json文件和自动上传这两个打包流程设计成两个接口,然后设计不同的子类实现它们,让子类去实现它们原有的逻辑。下面是具体的代码。 ? ?...按照我们上面了解的那样,我们需要针对接口编程,所以,我们需要把我们新设计的json文件和自动上传这两个流程的接口放到原先的打包类中,而原先的打包类中已经不需要自己处理这两部分流程了,具体的流程而是我们已经设计好的相关的子类去实现

    39120

    JavaScript函数和类

    : 接口继承:子类的实例肯定也是超类的实例(可以用instanceof运算符测试得到这条结论)。...子类实例的行为类似于超类实例。但和超类实例相比,可以有一些额外的功能(即方法)。 实现继承:超类将功能传递给子类。实现继承的类的作用是有限的,因为只支持单继承,不可能从多个超类继承。...那么就又需要继承自Storage类和Validation类。那么Employee 类从Person类继承就是接口继承,因为超类和子类的行为类似。...Employee 类从Storage继承或者从Validation继承都是实现继承,因为超类只是将功能传递给子类。...,输入是超类,输出是扩展该超类的子类 class Person { } const Storage = Sup => class extends Sup { save(data) {

    88631

    Spring认证中国教育管理中心-Spring Data Couchbase教程二

    覆盖属性 Java 允许灵活设计域类,其中子类可以定义一个已在其超类中以相同名称声明的属性。...从编程模型的角度来看,有几点需要考虑: 应该保留哪个属性(默认为所有声明的属性)?您可以通过使用 注释这些属性来排除属性@Transient。 如何在数据存储中表示属性?...Kotlin 对象创建 Kotlin 类支持实例化,默认情况下所有类都是不可变的,需要明确的属性声明来定义可变属性。...它允许创建新实例,因为 Kotlin 生成一个copy(…)创建新对象实例的方法,该方法从现有对象复制所有属性值并将作为参数提供的属性值应用到该方法。...从编程模型的角度来看,有几点需要考虑: 应该保留哪个属性(默认为所有声明的属性)?您可以通过使用 注释这些属性来排除属性@Transient。 如何在数据存储中表示属性?

    1.8K50

    Swift基础 继承

    当一个类从另一个类继承时,继承类被称为子类,它继承的类被称为其超类。继承是一种基本行为,可以将类与 Swift 中的其他类型区分开来。...Swift中的类可以调用和访问属于其超类的方法、属性和下标,并可以提供这些方法、属性和下标的覆盖版本,以细化或修改其行为。Swift通过检查覆盖定义是否具有匹配的超类定义来帮助确保您的覆盖正确。...注意 Swift类不会从通用基类继承。您在不指定超类的情况下定义的类会自动成为供您构建的基类。 下面的示例定义了一个名为Vehicle的基类。...访问超类方法、属性和下标 当您为子类提供方法、属性或下标覆盖时,有时使用现有的超类实现作为重写的一部分非常有用。例如,您可以细化该现有实现的行为,或将修改后的值存储在现有继承的变量中。...子类不知道继承属性的存储或计算性质——它只知道继承属性具有特定的名称和类型。您必须始终声明要重写的属性的名称和类型,以使编译器能够检查您的重写是否与具有相同名称和类型的超类属性匹配。

    11300
    领券