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

Java继承中static成员函数重写

在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常非static函数那样运行。...static in testClass1 16 tc2.SMothod(); //输出结果为 static in testClass2 17 } 18 } 从结果中可以看到,当我们用父实例引用...(实际上该实例是一个子类)调用static函数时,调用是父static函数。...原因在于方法被加载顺序。 当一个方法被调用时,JVM首先检查其是不是方法。如果是,则直接从调用该方法引用变量所属中找到该方法并执行,而不再确定它是否被重写(覆盖)。...如果不是,才会去进行其它操作(例如动态方法查询),具体请参考:方法加载

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

派生中虚函数和非虚函数继承效果

而虚函数作用,主要是为了让父指针可以调用子类函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++函数主要作用是“运行时多态”,父中提供虚函数实现,为子类提供默认函数实现。...子类可以重写父函数实现子类特殊化。 2、纯虚函数:   C++中包含纯虚函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数子类才能new出对象。   ...C++中纯虚函数更像是“只提供申明,没有实现”,是对子类约束,是“接口继承”。   C++中纯虚函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系中,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

7010

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

一、继承机制中派生 static 关键字 1、子类继承静态成员 子类继承静态成员 : 父 ( ) 中 使用 static 关键字 定义 静态成员变量 , 可以被所有的 子类 (...派生 ) 共享 ; 2、父静态成员访问控制权限改变 继承自 父 静态成员变量 , 仍然遵循 继承中 子类 访问控制特性 , public 公有继承 : 父成员 在 子类 中 , 访问控制权限...成员 ; 父 private 成员 仍然是 private 成员 ; protected 保护继承 : 父成员 在 子类 中 , 访问控制权限 变为 protected , 公有成员...成员 ; 父 private 成员 仍然是 private 成员 ; private 私有继承 : 父成员 在 子类 中 , 所有成员访问控制权限 变为 private , 所有成员...; 或 对象名.静态成员名 child.c = 30; 方式 , 访问 继承自 父 静态成员 ; 4、静态成员使用要点 参考 【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 |

33410

从零开始学C++之继承(二):继承与构造函数、派生转换

一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生中需要声明自己构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...从输出可以看出: 派生对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生对象成员构造函数,最后是派生自身构造函数。...初始化列表参数多个且其中有调用构造函数时,先执行构造函数(从最远开始,如果多重继承则按继承顺序);其他对象成员若不止一个,则按定义顺序构造,与初始化列表顺序无关。...派生对象自动转换为对象(特有的成员消失) 当派生以private/protected方式继承时 派生对象指针(引用)转化为对象指针(引用)需用强制类型转化。

1.5K00

浅谈一下编程思想(一)

是对象模板,它定义了对象具有的属性(成员变量)和方法成员函数)。对象是实例化,每个对象都具有定义属性和方法。 封装:封装是将数据和方法打包在一个对象中,并对外部隐藏对象内部细节。...继承继承是一种机制,允许创建一个新(子类或派生),该类继承了一个或多个现有(父属性和方法继承可以促进代码重用,减少代码重复编写。...3.LSP(里氏替换原则) 子类型必须完全实现接口:子类型应该继承或实现所有属性和方法,以确保能够无缝地替换实例。...这允许子类型在不破坏替换性前提下,提供自己特定行为。 保持不变性:子类型不应该破坏不变性条件。这意味着子类型操作不应该导致不变性条件变为假。这是确保程序正确关键。...LSP目标是确保在使用多态性时,代码可以安全地替换实例为子类实例,而不会引发错误或破坏程序正确性。

24310

八股文-面向对象理解

继承 继承是一种机制,允许一个(子类)基于另一个(父定义来构建。子类继承了父属性和方法,同时可以通过扩展或修改来增加或改变其行为。...继承促进了代码重用,通过建立层次结构,提高了代码可维护性和扩展性。 多态 多态性是指同一个方法在不同对象上产生不同行为。...开放封闭原则(Open/Closed Principle,OCP) 软件实体(、模块、函数等)应该对扩展是开放,但对修改是封闭。...里氏替换原则(Liskov Substitution Principle,LSP) 子类型必须能够替换掉它们类型,而程序仍然能够工作。这意味着派生必须能够替代其,而不引起任何错误或异常。...这鼓励使用接口和抽象来实现松耦合,降低模块之间依赖性。 这五大原则共同构成了一个强大设计理念,帮助开发者编写可维护、可扩展、灵活面向对象代码。

18920

面向对象设计五项基本原则

比如删除掉一个成员函数、改变成员函数形参列表或更改数据成员类型等。实现对修改封闭,关键在于抽象化。...C++语言机制将抽象与多态建立在继承基础上,其实现方法是面向接口编程:通过提取纯虚(Abstract Class),将公共部分抽象为接口或由子类重写覆盖方法来达到多态目的。...我们知道正方形是一个特殊长方形,所以可以设计两个,正方形继承自长方形。长方形有两个成员变量,分别表示长和宽,有个计算面积成员函数。假如计算面积方法是virtual,这样能实现多态。...一般情况我们是先关注细节,然后根据细节抽象出来一些概括方法,所以按常理一般是抽象要依赖于细节,而现在是是倒过来了,确定一个抽象后,那些细节实现得以抽象出来方法为基准,变成了细节依赖于抽象了,不然你要继承了一个抽象...单一职责原则与接口分离原都体现了内聚思想; (2)开放封闭原则,要求不作修改而能够扩展功能,体现了封装与继承; (3)Liskov替换原则,要求派生要能够替换,是对继承规范;

93620

C# .NET面试系列二:面向对象

这样可以确保在创建派生对象时,构造函数也得到正确地执行。5. 抽象和接口有什么区别?...需要注意是,静态成员初始化和静态构造函数只会在第一次被使用时执行,而实例构造函数和非静态成员初始化在每次创建实例时都会执行。这确保了在使用前得到正确初始化。7. 接口是否可继承接口?...通过继承,子类可以从父继承已有的属性和方法,无需重新编写相同代码,从而提高了代码复用性。这对于减少冗余代码、提高开发效率和降低维护成本都具有重要意义。9. 请说说引用和对象?...重写(Override):重写指的是在派生中实现一个与方法(使用 virtual 关键字声明方法具有相同签名方法。重写允许派生提供自己实现,覆盖方法。...非静态成员包括非静态字段、非静态方法等,属于实例,需要通过实例访问。理解静态变量和静态成员重要性在于它们提供了在级别上共享数据和行为机制,而不必依赖于实例。14. 属性能在接口中声明吗?

14610

Java基础:继承

什么是继承 继承就是子类继承特征和行为,使得子类对象(实例)具有实例域和方法,或子类从父继承方法,使得子类具有相同行为。 2....使用 super 调用构造器语句必须是子类构造器第一条语句。 3. 继承初始化过程 在继承关系中,子类具有相同行为,当子类调用父方法时,如何确保父实例域是正确初始化?...这种方式很重要,因为导出 static 初始化可能会依赖于成员能否被正确初始化。 构造器总是在导出构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个构造器都能得到调用。...这样做是有意义,因为构造器具有一项特殊任务:检查对象是否被正确构造。导出只能访问它自己成员,不能访问成员成员通常是 private)。...继承涉及到和导出这两个,而不是只有一个,但从外部看来,它就像是一个和具有相同接口,或许还会有额外方法和域。但继承并不只是复制接口。

55510

面向对象设计SOLID原则

三、开放封闭原则 (Open-Closed Principle, OCP) 什么是开放封闭原则 开放封闭原则强调软件实体(、模块、函数等)应该对扩展开放,但对修改关闭。...Substitution Principle, LSP) 什么是里式替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是SOLID原则之一,它规定子类对象可以替换其对象而不影响程序正确性...换句话说,如果一个,那么任何继承自该类子类应该能够无缝替代。LSP强调了继承关系一致性和可靠性,以确保子类不会破坏原有代码行为,从而增强了软件可维护性和可扩展性。...抽象: 抽象是定义了通用接口或,它描述了高级模块和低级模块之间通信方式。抽象不应该包含具体细节,而只定义接口或方法。 具体细节: 具体细节是实际实现抽象或模块。...团队协作改善: 遵循SOLID原则代码更容易理解,有助于团队成员更好地协同工作,因为每个人都可以更容易地理解和扩展代码。 增加可测试性: 这些原则有助于编写更容易测试代码。

32030

Java 继承、多态与复用

隐藏 是 针对成员变量和静态方法 ,而 覆盖 是 针对普通方法 。 ---- 3、 初始化与构造器   我们知道,导出就像是一个与具有相同接口,或许还会有一些额外方法和域。...因此,对子对象正确初始化是至关重要,并且Java也提供了相应方法来保证这一点: 导出必须在构造器中调用构造器来执行初始化,而构造器具有执行初始化所需所有知识和能力。...基于动态绑定机制,我们就可以编写只与打交道代码了,并且这些代码对所有的导出都可以正确运行。或者说,发送消息给某个对象,让该对象去断定该做什么事情。...加载及初始化顺序 首先,必须指出加载及初始化顺序为:父静态代码块->子类静态代码块->父非静态代码块->父构造函数->子类非静态代码块->子类构造函数   即,首先,初始化父静态成员变量和静态代码块...接下来,根基 static域 和 static代码块 会被执行,然后是下一个导出,以此类推这种方式很重要,因为导出static初始化可能会依赖于成员能否被正确初始化。

68720

《Effective C++》读书笔记(2):构造析构赋值运算

款5、了解C++默认编写并调用哪些函数 通常情况下,如果代码中没有声明构造函数、拷贝构造函数、拷贝运算符、析构函数,编译器会在需要时创建他们,但这往往只能满足编译器需求,很可能无法满足程序需求...至于生成拷贝构造函数和拷贝操作符只是单纯将每个非静态成员变量拷贝;有const成员或者引用成员时,以及拒绝拷贝操作符时,默认生成拷贝操作符没有意义,必须自己定义。...可以让它们继承上面的,即可禁止编译器生成拷贝操作:编译器试图为它们生成拷贝构造/拷贝运算符时会尝试调用Uncopyable对应操作,而这会被拒绝。...: DBConnection db; bool closed; }; ---- 条款9、绝不在构造和析构过程中调用virtual函数 C++构造过程是先构造再构造子类、先初始化再进入构造函数体...因此,必须仔细地复制所有派生成员,并调用拷贝操作来复制成员

13930

Java 基础概念·面向对象基本特征与原则

继承 所谓继承(Inheritance),是指这样一种能力:它可以使用现有所有功能,并在无需重新编写原来情况下对这些功能进行扩展。...通过继承创建称为“子类”或“派生”,被继承称为“”、“父”或“超”。继承过程,就是从一般到特殊过程。...实现继承是指直接使用属性和方法而无需额外编码能力;接口继承是指仅使用属性和方法名称、但是子类必须提供实现能力; 多态 所谓多态(Polymorphism),就是指一个实例相同方法在不同情形有不同表现形式...让依赖于固定抽象,所以修改就是封闭;而通过面向对象继承和多态机制,又可以实现对抽象继承,通过覆写其方法来改变固有行为,实现新拓展方法,所以就是开放。...在父和子类具体行为中,必须严格把握继承层次中关系和特征,将替换为子类,程序行为不会发生任何变化。同时,这一约束反过来则是不成立,子类可以替换,但是不一定能替换子类。

41750

设计模式概念和七大原则

LSP 里氏代换原则 所有引用地方必须能透明地使用其子类对象 DIP 依赖倒转原则 依赖于抽象,不能依赖于具体实现 ISP 接口隔离原则 之间依赖关系应该建立在最小接口上 CARP 合成...开闭原则 开闭原则(Open Closed Principle,OCP)定义是:一个软件实体如、模块和函数应该对扩展开放,对修改关闭。...子类为什么可以替换位置 其实原因很简单,只要存在继承关系,所有非私有属性或者方法,子类都可以通过继承获得(白箱复用),反过来不成立,因为子类很有可能扩充自身非私有属性或者方法,这个时候不能用获取子类新增这些属性或者方法...聚合和合成关系 这里用山羊举例说明聚合和合成关系: 为什么要用合成/聚合来替代继承达到复用目的 继承复用破坏包装,因为继承实现细节暴露给派生内部细节通常对子类来说是可见,这种复用也称为...这里有一个明显问题是:派生继承,如果实现发生改变,将会影响到所有派生实现;如果从继承而来实现是静态,不可能在运行时发生改变,不够灵活。

16.7K40

【笔记】《C++Primer》—— 第三部分:设计者工具

我们很多时候希望是我们通过将指针指向派生,然后可以动态调用派生函数,这时我们可以将对应函数写为虚(virtual)函数来实现,此时发生称为动态绑定 派生可以继承多个,称为多继承...每次继承一个就会在内存中生成一个子对象,存放了成员,也正是因为这个原因派生可以转换为 派生构造函数需要负责所有成员初始化,尽管派生也可以初始化继承成员,但是这不符合通常编码思路...定义方法是在声明函数时候函数体类似显式默认构造写法改写为=0,只能对虚函数使用这个写法 友元只对被声明有效,友元或派生都不是友元 某个对其继承成员访问权限受到两个因素影响:...中此成员访问说明符,这是最重要一部分 派生派生列表访问说明符,这一项决定是派生继承成员对外表现出最高权限 有时候我们需要改变外部对派生继承某个名字访问级别,可以在自己访问控制符处用...using语句并不要指定形参列表,可以将所有重载函数都加入派生作用域中 继承体系中,最关键通常需要定义一个虚析构函数,这样我们才能动态分配体系中对象,确保delete时能够执行正确析构函数版本

1.7K10

C++基础-继承

1.2 构造函数继承与覆盖 一个只初始化其直接,出于同样原因,一个也只继承其直接构造函数。...,派生构造函数会隐式调用默认构造函数,这由编译器实现,不需编写调用代码; 如果没有默认构造函数,即提供了重载构造函数,则派生构造函数通过初始化列表来调用构造函数,这属于显式调用。...这两种场合访问权限组合时,编译器采用最严格策略,确保派生继承得到成员具有最低访问权限。...例如,公有成员遇到私有继承时,就变成派生私有成员保护成员遇到公有继承时,就变成派生保护成员私有成员派生不可见。...私有成员仍然为所私有,派生不可见。 私有继承使得只有派生才能使用属性和方法,因此表示“有一部分”(has-a)关系。

95920

独家 | Python中SOLID原则(附链接)

我们可以通过将我们编写所有函数转换成一个子类方法来解决这个问题。在本例中,我创建了一个名为“Operations”抽象和一个抽象方法“get_operation”。...简单地说,如果子类重新定义了同样在父中出现函数,用户不应该注意到任何差异,它只是一个替代品。 例如,如果您正在使用一个函数,而您同事更改了,那您不应该注意到任何差异。...我可以用最简单方式来概括这一原则: 如果在子类中重新定义了中也存在函数,那么这两个函数应该具有相同行为。但是,这并不意味着它们必须强制性等同,而是:给定相同输入能得出相同类型结果。...在这种意义上,IS原则告诉我们,其实有所需界面(SRP)就行了,我们应该避免那些无法工作或没有理由成为该类一部分方法。 当子类从它不需要继承方法时,就会出现这个问题。...两者都应该依赖于抽象” 因此,抽象(例如,上面看到界面)不应该依赖于低级方法,而应该都依赖于第三个界面。 为了更好地解释这个概念,我倾向于认为这是一种信息流。

30630

Python面向对象基础

继承名后加括号 括号中是继承列表, 称之为父或者或者超 继承一个明显好处就是可以获取父属性和方法 class Base: PUBLIC_CLASS_VAR = 'PUBLIC_CLASS_VAR...凡是私有的都不能继承 原来是什么,继承过来还是什么 方法重写 当子类和父有同名成员时候, 子类成员会覆盖父同名成员 当父含有一个带参数初始化方法时候,子类一定需要一个初始化方法,并且在初始化方法中调用父初始化方法...(MRO)不满足报错 分析E,AMRO >>> A....在具有继承能力编程语言中, mixin可以为增加额外功能或方法。...通常来说,组合优于继承 Mixin 限制 Mixin不应该有初始化方法 Mixin通常不能独立工作 Mixin祖先也应该是Mixin 通常情况下,Mixin总在继承列表第一位

1.1K30

面向对象 6 个基本原则

一个软件实体如果使用是一个, 那么当把这个替换成继承子类, 程序行为不会发生任何变化。 软件实体察觉不出对象和子类对象区别。...Java中接口代表能力、代表约定、代表角色,能否正确使用接口一定是编程水平高低重要标识。...依赖倒置原则( Dependecy-Inversion Principle ) 即我们依赖于抽象, 而不是依赖于具体, 也就是我们经常听到“要面向接口编程” 。...中放置一个Hashtable类型成员并且将其键和值都设置为字符串来存储数据,而Stack设计也应该是在Stack中放一个Vector对象来存储数据。...其中,我们称出现成员变量、方法参数、方法返回值中为直接朋友,而出现在局部变量中则不是直接朋友。也就是说,陌生最好不要作为局部变量形式出现在内部。

37620
领券