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

为什么子类的init方法也改变了父类?

子类的init方法改变了父类的原因是因为子类在继承父类时,会继承父类的所有属性和方法,包括构造函数(init方法)。当子类定义了自己的init方法时,如果没有显式调用父类的init方法,那么子类的init方法会覆盖父类的init方法,从而改变了父类的初始化行为。

在面向对象编程中,子类继承父类的属性和方法,可以通过调用父类的init方法来初始化父类的属性。如果子类定义了自己的init方法,但没有显式调用父类的init方法,那么父类的属性就不会被正确地初始化,可能导致意料之外的行为。

为了避免这种情况,子类的init方法应该在自己的初始化逻辑之前调用父类的init方法,以确保父类的属性得到正确的初始化。在大多数编程语言中,可以使用super关键字来调用父类的init方法。

总结起来,子类的init方法改变了父类的原因是因为子类继承了父类的init方法,并且在定义自己的init方法时没有正确地调用父类的init方法。为了避免这种情况,子类应该在自己的init方法中调用父类的init方法,以确保父类的属性得到正确的初始化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python_子类调用方法

1.方式一 子类调用方法,包含2中形式调用。一种形式是在内部通过继承方式调用方法,另外一种形式是子类实例化后之后通过继承方式来调用方法。如下图所示: ?...注意一点,在子类内部通过继承方式调用属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来含义就是指向实例自己));而实例在通过继承调用属性或方法时...3班") #调用子类本身方法 student.course() #通过子类调用方法--->实例化之后来调用方法 student.eat() #调用子类方法,在子类方法中调用了子类方法,...使用super好处,一是可以代替父名,这样后期名更改了,我们只需要更改子类名称后面的名即可,子类中其他名可以不用更改;二是使用了super后,调用方法时可以不传参数self。..."11届土木3班") #调用子类本身方法 student.course() #通过子类调用方法--->实例化之后来调用方法 student.eat() #调用子类方法,在子类方法中调用了子类方法

4.8K20

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

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

6.1K10

子类调用同名方法和属性

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

1.8K20

ES6 子类方法重写

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

58840

子类继承,重写synchronized方法,两个synchronized方法锁对象问题

参考链接: 用子类引用子类对象 vs 引用 这是java并发编程实践中有关重入概念介绍时产生问题  public class Widget {       public synchronized...System.out.println(toString() + ": calling doSomething");           super.doSomething();       }   }  子类继承...,重写synchronized方法,两个synchronized方法锁对象问题  是同一个锁还是不同锁呢,是同一个锁的话是  对象作为锁还是子类对象作为锁呢? ...something else  说明肯定是同一对象  另外main方法里最后那步执行对象是子类,按着定义,谁调用方法谁作为锁,所以这个一定是子类对象,那么super.doSomething()这个方法一定也是子类对象...,至于理解么:  可以认为即便是继承创建了对象,并把对象引用交给了子类,但是在super.去调用方法时候JVM认为调用者依然是子类

1.7K20

python中子类调用初始化方法

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

2.1K10

中如果没有无参构造方法(中只给了带参构造方法),子类构造方法怎么办?

中如果没有无参构造方法(中只给了带参构造方法),子类构造方法怎么办? /* 中如果没有无参构造方法(中只给了带参构造方法),子类构造方法怎么办?   ...法1:子类构造方法通过 super(...); 去显示调用带参构造方法。   ...法2:子类构造方法通过 this();/this(...); 调用本类其他构造方法,但是子类其他构造方法中一定会有一个去访问了带参构造方法。   法3:让提供无参构造。...;/super(...); 这三个语句访问子类构造方法时候,必须放在第一句语句上。         否则,就可能会对数据进行多次初始化。 */ 示例代码如下图所示: ?

1.5K10

【Kotlin】Kotlin 继承 三 ( super 关键字使用 | super@ 外部调用方法 | 子类选择性调用 接口 方法 super )

子类调用 : 子类可以任意调用 public , protected 可见性属性与方法 ; 3 ....super 关键字进行简单调用即可 ; ② 子类内部类调用 : 如果想要在子类内部调用成员和方法 , 需要使用 super@子类名称 调用 ; ③ 子类调用不同父同名方法 : 如果子类继承...子类调用方法 ( super ) ---- 子类调用方法 : 子类中可以通过 super 调用方法 , 包括普通方法 , 和属性访问 setter 方法 ; 其中 super 相当于对象引用...子类内部类调用方法 ( super@ ) ---- 子类内部类调用方法 : 在子类内部类中 , 如果想要访问方法 , 可以使用 super@子类名称.方法() 形式 , 调用方法...子类选择性调用 / 接口方法 : 子类可以继承 , 实现多个接口 , 如果与接口 , 或者不同接口之间定义了相同名称方法 , 那么需要使用 super.方法名() 选择调用指定

1.3K10

【C++】继承 ⑩ ( 继承机制中 static 静态成员 | 子类中访问静态成员方法 )

一、继承机制中派生 static 关键字 1、子类继承静态成员 子类继承静态成员 : ( 基 ) 中 使用 static 关键字 定义 静态成员变量 , 可以被所有的 子类 (...派生 ) 共享 ; 2、静态成员访问控制权限改变 继承自 静态成员变量 , 仍然遵循 继承中 子类 访问控制特性 , public 公有继承 : 成员 在 子类 中 , 访问控制权限...不变 , 共有 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; public 成员 仍然是 public 成员 ; protected 成员 仍然是 protected...和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; public 成员 变为 子类 protected 成员 ; protected 成员 仍然是 protected...都不可在子类中访问 ; public 成员 变为 子类 private 成员 ; protected 成员 变为 子类 private 成员 ; private

37610

零基础学习 Python 之继承(二)

调用被覆盖方法 我们昨天说过,如果子类里有和类同样名称方法和属性,那么相应部分不再被继承到子类。那么如果有这么一种情况,如果子类还想继续使用方法,那么该怎么办?...Boy 初始化方法,与昨天例子有所不同,为了能继续在子类中使用初始化方法,以方法方式调用 Person....()) 此刻运行结果估计你能猜出来: snow rocky 这样使中被覆盖方法能再次在子类中使用。...但是上述方式有一个问题,那就是如果名称因为某种玄学方式被改变了子类所对应名也要,如果你忘记了,就会出现异常,程序少还可以,程序如果特别多的话,你可能会忘记一两个地方,然后就苦逼...在这里有一个小问题:如果一个子类继承了两个,并且两个中都有相同属性或者方法,那么实例化之后子类所调用该属性或方法是属于哪个呢?

26910

关于Java构造函数(Constructor)常见问题总结1 为什么调用子类构造方法时候,默认会调用构造方法2 常见错误:Implicit super constructor is und

1 为什么调用子类构造方法时候,默认会调用构造方法 看下面这个简单例子: package cc; public class Sub extends Super { public Sub...这就是为什么我们上面的那个例子程序会先调用super构造方法。 但要切记,** 虽然调用了构造方法,但只创建了一个对象也就是子对象。...** 之所以要调用构造方法,是因为super可能需要构造函数来初始化一些私有的成员变量。...解决这个问题很简单,我们可以给插入一个无参构造函数,或者在子类构造函数中显示调用有参构造函数。 在子类构造函数中显示调用构造函数 下面的代码是正确。 ?...Paste_Image.png 构造函数使用规则 简单说,在使用时候,子类构造函数必须调用构造函数,不管有没有显示声明。所以,被调用构造函数,一定在定义好!

2.7K30

python

super()和init()和new()方法 首先super,我们都知道他意思是继承含义,但是python中继承实现可以直接再括号中写例如ChildA和childB,这两个是一样 class...self不是代表,而是代表是实例。同时在继承时调用init()方法。 new() 函数只能用于从object继承新式。 这里扯一嘴,什么是新式与旧式?...由上可知,可以returnnew()出来实例,这时候顺序是,子类new,new,子类init() class A(object): def __init__(self): print....对于实例方法,我们知道在里每次定义方法时候都需要绑定这个实例,就是foo(self, x),为什么要这么做呢?...'调用方法' class Child(Parent): # 定义子类 def myMethod(self): print '调用子类方法' c = Child()

1K30

一个以前没有注意问题:java构造函数执行顺序

初始化分为为初始化和实例初始化 2. 每个在 JVM 中都对应一个 Class 实例 3. 实例是作为子例部分存在 (Class 实例之间存在父子关系) 4....子类静态属性、静态 (子类初始化,对应 JVM 方法 cinit()) 3. 实例构造,实例变量初始化 (实例变量初始实际会放到 JVM init() 中) 4....子类实例构造,实例变量初始化 (也是对应 init() 方法) 关于 Class 实例,可以回想 Log 声明 Log log = LogFactory.getLog(TestClass.class...); 也就是无论你,new 多少个 TestClass 实例,它们对应着同一个 TestClass Class 实例,也就是为什么很多地方把静态方法、静态属性说成是方法属性,其实质就是在...size()就是实例地址空间,到size(子类)就是子类实例地址空间。

63220

一个以前没有注意问题:java构造函数执行顺序

初始化分为为初始化和实例初始化 2. 每个在 JVM 中都对应一个 Class 实例 3. 实例是作为子例部分存在 (Class 实例之间存在父子关系) 4....子类静态属性、静态 (子类初始化,对应 JVM 方法 cinit()) 3. 实例构造,实例变量初始化 (实例变量初始实际会放到 JVM init() 中) 4....子类实例构造,实例变量初始化 (也是对应 init() 方法) 关于 Class 实例,可以回想 Log 声明 Log log = LogFactory.getLog(TestClass.class...); 也就是无论你,new 多少个 TestClass 实例,它们对应着同一个 TestClass Class 实例,也就是为什么很多地方把静态方法、静态属性说成是方法属性,其实质就是在...size()就是实例地址空间,到size(子类)就是子类实例地址空间。

67210

一个以前没有注意问题:java构造函数执行顺序

初始化分为为初始化和实例初始化 2. 每个在 JVM 中都对应一个 Class 实例 3. 实例是作为子例部分存在 (Class 实例之间存在父子关系) 4....子类静态属性、静态 (子类初始化,对应 JVM 方法 cinit()) 3. 实例构造,实例变量初始化 (实例变量初始实际会放到 JVM init() 中) 4....子类实例构造,实例变量初始化 (也是对应 init() 方法) 关于 Class 实例,可以回想 Log 声明 Log log = LogFactory.getLog(TestClass.class...); 也就是无论你,new 多少个 TestClass 实例,它们对应着同一个 TestClass Class 实例,也就是为什么很多地方把静态方法、静态属性说成是方法属性,其实质就是在...size()就是实例地址空间,到size(子类)就是子类实例地址空间。

99120

一个以前没有注意问题:java构造函数执行顺序

初始化分为为初始化和实例初始化 2. 每个在 JVM 中都对应一个 Class 实例 3. 实例是作为子例部分存在 (Class 实例之间存在父子关系) 4....子类静态属性、静态 (子类初始化,对应 JVM 方法 cinit()) 3. 实例构造,实例变量初始化 (实例变量初始实际会放到 JVM init() 中) 4....子类实例构造,实例变量初始化 (也是对应 init() 方法) 关于 Class 实例,可以回想 Log 声明 Log log = LogFactory.getLog(TestClass.class...); 也就是无论你,new 多少个 TestClass 实例,它们对应着同一个 TestClass Class 实例,也就是为什么很多地方把静态方法、静态属性说成是方法属性,其实质就是在...size()就是实例地址空间,到size(子类)就是子类实例地址空间。

94820
领券