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

5.1 子类

5.1 子类   子类拥有的功能更加丰富。   在本例中,Manager类比Employee封装了更多的数据,拥有更多的功能。   ...中还继承了name、salary和hireDay这3个域,所以现在就有了4个域(由于增加了bonus域)。   ...在通过扩展定义子类的时候,仅需要指出子类的不同之处,因此,会将通用的方法放在中,而将具有特殊用途的方法放在子类中,这种将通用的功能放在方法,在面向对象程序设计中十分普遍。   ...由于Manager的构造器不能访问Employee的私有域,所以必须利用Employee的构造器对这部分私有域进行初始化,我们可以通过super实现对构造器的调用。...可以将一个子类变量赋给一个变量,但不能将一个变量赋给一个子类变量。 5.1.3 动态绑定   调用方法的过程可以分解为:   (1)编译器查看对象的声明类型和方法名。

1K90

python中子类调用父初始化方法

子类不显式调用父的构造方法,而父构造函数初始化了一些属性,就会出现问题 如果子类和父都有构造函数,子类其实是重写了父的构造函数,如果不显式调用父构造函数,父的构造函数就不会被执行,导致子类实例访问父初始化方法中初始的变量就会出现问题...,构造函数被重写,但新的构造方法没有任何关于初始化的namea属性的代码,为了达到预期的效果,子类的构造方法必须调用其父的构造方法来进行基本的初始化。...方法一更直观,方法二可以一次初始化所有 super函数比在累中直接调用未绑定方法更直观,但是其最大的有点是如果子类继承了多个父,它只需要使用一次super函数就可以。...二、第二种解释     在Python中子类继承父的过程中,如果子类不覆盖父的__init__()方法,则子类默认将执行与父一样的初始化方法。...但是假如子类自己重写 了(也成为覆盖)父的__init__()方法,那么就需要显式的调用父初始化方法了。有两种方法可以做到:      1:ParentClass.

2.1K10
您找到你想要的搜索结果了吗?
是的
没有找到

子类继承父,父初始化

外部看,似乎新拥有与基础相同的接口,而且可包含一些额外的方法和字段。但继承并非仅仅简单地复制基础的接口了事。创建衍生的一个对象时,它在其中包含了基础的一个“子对象”。...这个子对象就象我们根据基础本身创建了它的一个对象。外部看,基础的子对象已封装到衍生的对象里了。...当然,基础子对象应该正确地初始化,而且只有一种方法能保证这一点:在构建器中执行初始化,通过调用基础构建器,后者有足够的能力和权限来执行对基础初始化。...个人总结: super关键字必须写在构造方法方法体内的非注释代码的首行 子类进行初始化,必须调用父的构造方法,如果父的所有构造方法都用private修饰了的话,则无法继承,编译报错....衍生构造方法调用父的构造方法,如果父是无参构造方法,那么编译器会为衍生的构造方法首行加上super()。 编译器会强迫我们在衍生构建器的主体中首先设置对基础构建器的调用。

1.8K30

子类,多态,上转型,下转型

; } public void usePareStaticThink(){ super.think(); //子类方法调用父静态方法 } } 写一个main...parent=new SuperClass(); ChildClass child=new ChildClass(); ChildClass.think(); //1.子类可直接调用父方法...child.say(); //2.子类方法重写并调用父方法 child.go(); //3.子类对象可以调父的非静态方法...child.think(); //4.子类对象可以调父的静态方法 child.usePareStaticThink(); //5.子类方法可以调用父静态方法(用super...我是父说! 我是子类说! 我是父走! 我是静态的,父想! 我是静态的,父想! 向上转型(多态): 我是父说! 我是子类说! 我是静态的,父想! 我是静态的,父想!

17210

Python实现子类调用父初始化实例

前言 python中进行面向对象编程,当在子类的实例中调用父的属性时,由于子类的__init__方法重写了父的__init__方法,如果在子类中这些属性未经过初始化,使用时就会出错。...方法一: 调用未绑定的父__init__方法方法定义时,首个参数均为self。当实例化这个时,self就被自动绑定到当前的实例。绑定也就意味着这个实例的属性,方法都可以通过‘self....但是如果通过名直接调用方法,self参数就不会被自动绑定到实例上,可以绑定到我们指定的实例上。也就是子类的实例上,在这里就是B了。...所以这里所说的未绑定的父__init__方法 就是指未绑定父实例的父__init__方法。...以上这篇Python实现子类调用父初始化实例就是小编分享给大家的全部内容了,希望能给大家一个参考。

2K20

禁止 Python 子类覆盖父方法

子类试图覆盖父的时候,可以通过类型标注来发出警告。今天,我们来讲讲如何直接禁止覆盖。 Python 原生是没有提供禁止子类覆盖父方法的功能,因此我们需要自己来实现。...先来看一下实现效果: 在这段代码里面,我们禁止子类覆盖父的dead()和eat()方法,但不禁止move方法。所以,当我们在子类Dog里面尝试覆盖父中的dead()时,程序就报错了。...Protect有一个__new__方法,这个方法会在使用了元的所有子类的__init__之前被调用。...在__new__里面,我们拿到了子类要定义的方法,并且检查他们是不是在我们传给protect的列表里面。如果在,说明这个方法不能被覆盖。...但当我们基于Animal实现Dog子类的时候,由于meta.has_base是True,所以进入检查逻辑。Dog的所有方法名都在attrs参数里面。

1.7K20

Python实现子类调用父方法

Person,但是并没有调用父的__init__()方法,那么怎样调用父方法呢?...有如下两种解决方案: 方法一:调用未绑定的父构造方法 class Person(object): def __init__(self): self.name = "Tom"...在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(称为绑定方法)。但如果直接调用方法(比如Person.__init__()),那么就没有实例会被绑定。...通过将当前的实例作为self参数提供给未绑定方法,Student就能使用其父构造方法的所有实现,从而name变量被设置。...方法一更直观,方法二可以一次初始化所有. super函数比在累中直接调用未绑定方法更直观,但是其最大的有点是如果子类继承了多个父,它只需要使用一次super函数就可以。

3.1K10

jvm角度看懂初始化方法重载、重写。

使用java.lang.reflect包的方法进行反射调用时,如果这个还没有进行过初始化,则会触发该类的初始化。 当初始化一个时,如果其父还没有进行过初始化,则会先触发其父。...这5种行为我们称为对一个的主动引用。 初始化过程 初始化过程都干了些什么呢? 在初始化过程中,说白了就是执行了一个构造器()方法过程。...下面,我们举例几个被动引用的例子: 通过子类引用父的静态字段,不会触发子类初始化 /** * 1.通过子类引用父的静态字段,不会触发子类初始化 */ public class FatherClass...但是,为什么会选择这个方法进行重载呢?虚拟机是如何选择的呢? 在此之前我们先来了解两个概念。...17和21是run()方法的调用指令。 指令可以看出,这两条方法的调用指令是完全一样的。可是最终执行的目标方法却并不相同。这是为啥?

63020

Python_子类调用父方法

1.方式一 子类调用父方法,包含2中形式的调用。一种形式是在内部通过继承的方式调用父方法,另外一种形式是子类实例化后之后通过继承的方式来调用父方法。如下图所示: ?...def __init__(self,name,age,sex,classnaem): #子类调用父的构造函数进行初始化 Person....3班") #调用子类本身的方法 student.course() #通过子类调用父方法--->实例化之后来调用父方法 student.eat() #调用子类方法,在子类方法中调用了子类方法,...def __init__(self,name,age,sex,classnaem): #子类调用父的构造函数进行初始化 # Person...."11届土木3班") #调用子类本身的方法 student.course() #通过子类调用父方法--->实例化之后来调用父方法 student.eat() #调用子类方法,在子类方法中调用了子类方法

4.8K20

子类调用父的同名方法和属性

Python面向对象中,利用子类调用父的同名方法和属性。...首先我们定义了两个父,Master和School # @author: 北山啦 # FileName: 12子类调用父的同名方法 # @time: 2022/6/5 14:54 #父Master...,子类如何来调用呢 在这里,定义Prentice,继承了Master和School,添加了和父类同名属性和方法 调用子类的属性和方法 如果调用了父的属性和方法,父类属性会自动掩盖子类属性,股灾调用属性前...__init__ print(f'运用{self.kongfu}制作煎饼果子') 调用父类属性和方法 如果调用父方法,但是为了保障调用到的是父的属性,必须在方法前调用父初始化...__init__ print(f'运用{self.kongfu}制作煎饼果子') '''调用父方法,但是为了保障调用到的是弗列的属性,必须在方法前调用父初始化'''

1.8K20

一日一技:如何禁止 Python 子类覆盖父方法

在昨天的文章里面,我们讲到了,当子类试图覆盖父的时候,可以通过类型标注来发出警告。今天,我们来讲讲如何直接禁止覆盖。...Python 原生是没有提供禁止子类覆盖父方法的功能,因此我们需要自己来实现。 先来看一下实现效果: 在这段代码里面,我们禁止子类覆盖父的dead()和eat()方法,但不禁止move方法。...所以,当我们在子类Dog里面尝试覆盖父中的dead()时,程序就报错了。...Protect有一个__new__方法,这个方法会在使用了元的所有子类的__init__之前被调用。...在__new__里面,我们拿到了子类要定义的方法,并且检查他们是不是在我们传给protect的列表里面。如果在,说明这个方法不能被覆盖。

1.4K40

java编程——jvm角度看懂初始化方法重写、重载

这5种行为我们称为对一个的主动引用。   初始化过程   初始化过程都干了些什么呢? 在初始化过程中,说白了就是执行了一个构造器()方法过程。...通过子类引用父的静态字段,不会触发子类初始化   /** * 1.通过子类引用父的静态字段,不会触发子类初始化 */public class FatherClass { //静态块 static...但是,为什么会选择这个方法进行重载呢?虚拟机是如何选择的呢?   在此之前我们先来了解两个概念。   ...但并不会转换成byte或者short,因为char到byte或者short的转换是不安全的。(为什么不安全?留给你思考下)   继续注释掉long类型的方法。...17和21是run()方法的调用指令。   指令可以看出,这两条方法的调用指令是完全一样的。可是最终执行的目标方法却并不相同。这是为啥?

48730

创建子类对象时,父构造函数中调用被子类重写的方法为什么调用的是子类方法

void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象的时候父会调用子类方法...但是:创建B对象父会调用父方法? 答案: 当子类被加载到内存方法区后,会继续加载父到内存中。...如果,子类重写了父方法子类方法引用会指向子类方法,否则子类方法引用会指向父方法引用。 如果子类重载了父方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父方法,则方法引用会指向父方法。 当子类对象创建时,会先行调用父的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译的时候,父构造方法调用的方法的参数已经强制转换为符合父方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

6.1K10

【C++】继承 ⑥ ( 类型兼容性原则 | 父指针 指向 子类对象 | 使用 子类对象 为 父对象 进行初始化 )

地方 , 都可以使用 " 公有继承 " 的 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 应用场景 : 直接使用 : 使用 子类对象 作为 父对象 使用 ; 赋值 : 将 子类对象 赋值给 父对象 ; 初始化 : 使用 子类对象 为 父对象 初始化 ; 指针 : 父指针 指向...); } 2、使用 子类对象 为 父对象 进行初始化 定义父对象 , 可以直接使用 子类对象 进行初始化操作 ; // II....类型兼容性原则 : 使用 子类对象 为 父对象 进行初始化 Parent parent = child; 3、完整代码示例 #include "iostream" using namespace...类型兼容性原则 : 使用 子类对象 为 父对象 进行初始化 Parent parent3 = child; // 控制台暂停 , 按任意键继续向后执行 system(

6900

ES6 子类对父方法的重写

子类对父方法的重写的概念子类对父方法的重写是指在子类中定义与父类同名的方法,并使用子类的实现来替换父方法。当子类调用该方法时,将执行子类的实现而不是父的实现。...这允许子类根据自身的需求来修改或扩展父的行为。语法ES6中子类对父方法的重写的语法非常简单。在子类中,定义与父类同名的方法,并提供子类自己的实现。当子类调用该方法时,将执行子类的实现。...methodName() { // 子类方法的实现,替换了父方法实现 }}在上述代码中,ChildClass继承自ParentClass,并重写了父的methodName()方法。...当我们创建ChildClass的实例并调用methodName()时,将执行子类方法实现。示例让我们通过示例来理解子类对父方法的重写。...当我们创建Circle的实例并调用calculateArea()方法时,将执行子类Circle的方法实现,输出圆的面积。通过重写父方法子类可以根据自身的需求来修改或扩展父的行为。

56440
领券