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

有没有办法防止在子类中重写方法?

有办法防止在子类中重写方法。在Java中,可以使用final关键字来防止方法被子类重写。将方法声明为final,就表示该方法不能被子类重写。例如:

代码语言:java
复制
public class ParentClass {
    public final void myMethod() {
        // 方法实现
    }
}

public class ChildClass extends ParentClass {
    // 这里不能重写myMethod()方法,否则会报错
}

在Python中,可以使用@property装饰器和setter方法来防止子类重写方法。例如:

代码语言:python
代码运行次数:0
复制
class ParentClass:
    @property
    def my_property(self):
        # 获取属性值的实现

    @my_property.setter
    def my_property(self, value):
        # 设置属性值的实现

class ChildClass(ParentClass):
    # 这里不能重写my_property属性,否则会报错

如果需要在子类中使用相同的方法名,但是实现不同的功能,可以考虑使用其他设计模式,例如策略模式或者适配器模式。

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

相关·内容

关于使用MethodHandle子类调用祖父类重写方法的探究

关于使用MethodHandle子类调用祖父类重写方法的探究 注:这个例子原本出现在周志明先生的《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...由于找到的thinking方法是非static的,需要一个隐式入参(也就是栈帧中局部变量表第0个位置的this参数),java这叫做该方法的接收者。...普通的方法调用,这个this参数是虚拟机自动处理的,表示的是当前实例对象,我们方法可以直接使用。...但是我们这个MethodHandle的例子,相当于是模拟了invoke*指令的处理,手动调用invoke方法就需要指定这个"this"参数。...我觉得使用bindTo绑定方法接收者要比invoke方法传递更加友好,也更加符合程序员的大众理解,invoke可以只专注方法显式的入参。 然后再来说bindTo(this)的this。

9.5K30

Java的静态方法不能被子类重写

参考链接: 可以Java重载或重写静态方法吗 Java的静态方法不能被子类重写 特点:静态方法属于类的方法,也属于对象的方法,但是静态方法随类的存在。...结论:Java的静态方法不能被子类重写,实际上,子类的静态方法隐藏了父类的静态方法,因此父类的子类的静态方法同时存在,只不过父类通过类名(或对象名)调用的是父类的静态方法子类通过类名(或对象名)调用的是子类的静态方法...,不支持多态,所以此处调用的父类的静态方法         f1.doWork();            // 非static(静态)方法的调用,支持多态         System.out.println...(final,private 方法也如此) (2)静态方法可通过类名直接调用,也可通过类的实例化对象调用,因此Father 的实例化对象f1调用的是父类(不是子类)的静态方法。...(3)静态方法的绑定时期为代码的编译器期,也叫前期绑定。非静态的方法属于程序的执行期绑定,也就运行期绑定。

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

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

    6.1K10

    Python 子类调用父类方法详解(单继承、多层继承、多重继承)

    测试环境: win7 64位 Python版本:Python 3.3.5 代码实践: 1、子类通过“类名”调用父类的方法 class FatherA: def __init__(self)...__init__(self) # 子类调用父类的方法:父类名.方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果: >>> ==...(如类SubClassB的父类由FatherA变为FatherD时),必须遍历整个类定义,把子类中所有的父类类名全部替换过来 2、子类通过“super”方法调用父类的方法 场景1、单层继承 class...__init__() # 子类调用父类的方法:super().方法名称(参数) if __name__ == '__main__': b = SubClassB() class FatherA...__init__() # 子类调用父类的方法:super(type, obj).方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果

    3.1K30

    为什么Java类的成员变量不能被重写?成员变量Java能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域的方法

    这篇文章讨论了Java面向对象概念中一个基本的概念--Field Hiding(成员变量隐藏) 成员变量Java能够被重写么?...不会重写成员变量,而是隐藏成员变量 Java文档对隐藏域的定义: Within a class, a field that has the same name as a field in the superclass...意思就是: 一个类子类的成员变量如果和父类的成员变量同名,那么即使他们类型不一样,只要名字一样。父类的成员变量都会被隐藏。子类,父类的成员变量不能被简单的用引用来访问。...其实,简单来说,就是子类不会去重写覆盖父类的成员变量,所以成员变量的访问不能像方法一样使用多态去访问。...访问隐藏域的方法 就是使用父类的引用类型,那么就可以访问到隐藏域,就像我们例子的代码 就是使用类型转换System.out.println(((Super)c1).s); 翻译自http://www.programcreek.com

    3.5K40

    为什么要重写hashcode和equals方法?初级程序员面试很少能说清楚。

    面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过。...这是符合逻辑的,但从当前结果看,26行的返回结果不是我们想象的那个字符串,而是null。 原因有两个—没有重写。第一是没有重写hashCode方法,第二是没有重写equals方法。...这里调用的仍是Object类的hashCode方法(所有的类都是Object的子类),而Object类的hashCode方法返回的hash值其实是k1对象的内存地址(假设是1000)。 ?...3 对面试问题的说明 由于项目里经常会用到HashMap,所以我面试的时候一定会问这个问题∶你有没有重写过hashCode方法?...你使用HashMap时有没有重写hashCode和equals方法?你是怎么写的? 根据问下来的结果,我发现初级程序员对这个知识点普遍没掌握好。

    35660

    Java的静态绑定与动态绑定

    静态绑定:程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。...关于final,static,private和构造方法是静态绑定的理解 private:对于private的方法,首先一点它不能被继承,既然不能被继承那么就没办法通过它子类的对象来调用,而只能通过这个类自身的对象来调用...final:方法虽然可以被继承,但不能被重写(覆盖),虽然子类对象可以调用,但是调用的都是父类中所定义的那个final方法,(由此我们可以知道将方法声明为final类型,一是为了防止方法被覆盖,二是为了有效地关闭...不过根据网上的资料和我自己做的实验可以得出结论:static方法可以被子类继承,但是不能被子类重写(覆盖),但是可以被子类隐藏。...唯一的不同就是,当子类对象上转型为父类对象时,不论子类有没有定义这个静态方法,该对象都会使用父类的静态方法。因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父类的成员变量是一样的。

    1.6K30

    多态、多态的好处(扩展性)

    Fu{} Fu f= new Zi();//父接口引用指向子类 多态成员访问特点 如,Fu f= new Zi();//左父类右子类 重点:成员方法,运行时,结果为子类重写的成员方法的结果。...构造方法:创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。 成员方法:编译看左边,运行看右边。(方法重写的意义) 静态方法:编译看左边,运行看左边。...且工具类里添加方法。 //我喜欢宠物兔、老虎、狼..... //若按上述添加猪的办法做,定义类,继承类,提供方法都是必须要的。...同时又有方法重写,运行的时候肯定是个各子类重写方法起作用。从而利用多态实现好的扩展性。...且工具类里添加方法。 //我喜欢宠物兔、老虎、狼..... //若按上述添加猪的办法做,定义类,继承类,提供方法都是必须要的。

    1.6K40

    C# 基础知识

    面向对象的三个特性:继承‘封装和多态 继承:就是子类实现父类的属性和方法,并在此基础上进行相关的扩展. 多态是建立重写的基础之上的,是类与类之间的关系,是发生在不同的类之间的,子类重写父类的方法。...实现不同的子类,不同的实现形态。 多态有3个条件 1:继承 2:重写(重写父类继承的方法) 3:父类引用指向子类对象 而重载是类的内部的方法构型上的不同,是发生在同一个类里面的。...protected限制方法本类和其子类,包括外项目的子类访问(直接调用,无需实例化);不能在本项目和其他项目的无继承关系类,以及通过实例调用访问 internal限制方法项目内部所有的类访问...,不能被其他项目访问 public使得方法可以在其它项目中访问,但是先要添加对该方法所在类所在项目的引用,并且using该类的命名空间; protected internal使得方法可以本项目所有的类和外项目有继承关系的子类访问...7.bs方面有没有做过? 8. 太赫兹是什么原理? 9.你项目中承担什么角色?做了那些事 10.你的项目用了什么设计模式? 11.架构有没有涉及,能自己设计出来吗? 12.检测结果如何分类?

    51520

    设计模式之模板方法模式

    设计模式是软件开发人员软件开发过程面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。...模板方法模式 模板方法模式一个方法定义一个算法的骨架,而将一些步骤延迟到子类。模板方法使得子类可以不改变算法结构的情况下,重新定义算法的某些步骤。...二是 cook() 方法使用 final 关键字修饰,防止子类重写,从而破坏了模板规定好的流程。...灭火"); } public void close(){ System.out.println("关闭抽油烟机"); } /** * 使用final关键字,防止子类重写...模板方法是设计模式较好理解的一种,它的使用场景是:当有一个业务有 N 个步骤( 模板 ),其中一部分步骤是永恒不变的,那么就将不变的这些步骤抽象到父类,可能变化的步骤留给子类去实现。

    37040

    java — 静态绑定和动态绑定

    1.静态绑定 private:不能被继承,则不能通过子类对象调用,而只能通过类本身的对象进行调用,所以可以说private方法方法所属的类绑定;   final:final方法虽然可以被继承,但是不能被重写...(覆盖),虽然子类对象可以调用,但是调用的都是父类的final方法(因此可以看出当类方法声明为final的时候,一是为了防止方法被覆盖,而是为了有效关闭java的动态绑定);   static:static...方法可以被子类继承,但是不能被子类重写(覆盖),但是可以被子类隐藏。...(这里意思是说如果父类里有一个static方法,它的子类里如果没有对应的方法,那么当子类对象调用这个方法时就会使用父类方法。而如果子类定义了相同的方法,则会调用子类定义的方法。...唯一的不同就是,当子类对象上转型为父类对象时,不论子类有没有定义这个静态方法,该对象都会使用父类的静态方法。因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父类的成员变量是一样的。

    3.5K90

    Java的三大特性 - 超详细篇

    (也可以叫做重写,不过这样跟重载有点混淆,所以个人喜欢叫做覆写) 他们之间的区别如下 重载 覆写 访问权限 可以不同 可以不同(但是子类的可见性不能比父类的低) 方法返回值 可以不同 相同 参数类型...(男人是人,is-a关系) 如果子类和父类只是包含或者引用的关系,那么这个继承关系就很糟糕(猫是猫笼,包含关系) 有没有什么办法可以阻止类的继承?...因为这样可以提高效率(细节:CPU处理方法调用的指令时,使用的分支转移会扰乱预取指令的策略,这个比较底层,这里先简单介绍,后面章节再深入) 那它有没有什么缺点呢?...有,如果一个方法内容过长,又误被当做内联处理,那么就会影响性能 比如你的代码多个地方都调用这个方法,那么你的代码就会膨胀变得很大,从而影响性能 那有没有办法可以解决呢?...场景很多,这里说两个最常用的 场景一:方法的参数,即方法定义时,父类作为方法的形参,然后调用时传入子类作为方法的实参 场景二:方法的返回值,即方法定义时,父类作为方法的返回值,然后方法内部实际返回子类

    51110

    Java 的三大特性(超详细篇)

    (也可以叫做重写,不过这样跟重载有点混淆,所以个人喜欢叫做覆写) 他们之间的区别如下 重载 覆写 访问权限 可以不同 可以不同(但是子类的可见性不能比父类的低) 方法返回值 可以不同 相同 参数类型...(男人是人,is-a关系) 如果子类和父类只是包含或者引用的关系,那么这个继承关系就很糟糕(猫是猫笼,包含关系) 有没有什么办法可以阻止类的继承?...因为这样可以提高效率(细节:CPU处理方法调用的指令时,使用的分支转移会扰乱预取指令的策略,这个比较底层,这里先简单介绍,后面章节再深入) 那它有没有什么缺点呢?...有,如果一个方法内容过长,又误被当做内联处理,那么就会影响性能 比如你的代码多个地方都调用这个方法,那么你的代码就会膨胀变得很大,从而影响性能 那有没有办法可以解决呢?...场景很多,这里说两个最常用的 场景一:方法的参数,即方法定义时,父类作为方法的形参,然后调用时传入子类作为方法的实参 场景二:方法的返回值,即方法定义时,父类作为方法的返回值,然后方法内部实际返回子类

    87510

    我来重新学习 javascript 的面向对象(part 4)

    Fruit 重写父类(超类)的原型对象的方法getType,调用的时候会覆盖屌父类 Food的原型对象的getType方法,直接使用子类Fruit的getType 子类 Fruit 添加一个方法到自己的原型对象里面...1.3 通过原型链实现继承时,不能使用对象字面量方法创建原型 主要是因为对象字面量方法重写原型链,这个原理之前章节说过,这里只是再次提醒。 // 省略。。。...原型链另外一个问题是,创建子类型的实例时,不能向超类型的构造函数传递参数,或者说,是没办法不影响所有对象实例情况下,给超类型的构造函数传递参数。...核心思想是子类型构造函数的内部调用超类型改造函数。...,这种合体方式能够满足一般继承的要求,但是带了其他问题: 没办法使用超类的原型对象里面定义的方法

    32810

    Java重载与重写的区别?

    重载: 发生在同一个类方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。...重写重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。 返回值类型、方法名、参数列表必须相同,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。...如果父类方法访问修饰符为 private/final/static 则子类就不能重写方法,但是被 static 修饰的方法能够被再次声明。构造方法无法被重写。...综上:重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变。 ?...方法重写要遵循“两同两小一大” “两同”即方法名相同、形参列表相同; “两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;

    68140
    领券