当前位置: 首页 > article >正文

在Java中,关于final、static关键字与方法的重写和继承【易错点】

在Java中,关于final、static关键字与方法的重写和继承【易错点】

  • 1.final方法不能被重写
  • 2.static方法不是重写,而是遮蔽
  • 3.final与static的组合
  • 4.final与继承
  • 5.static与继承

在这里插入图片描述

1.final方法不能被重写

如果父类中的方法被声明为final,那么这个方法就不能被子类重写。尝试在子类中定义与父类final方法同名、同参数列表、同返回类型(或子类型)的方法会导致编译错误。

class Parent {  
    final void show() {  
        System.out.println("Parent show()");  
    }  
}  

class Child extends Parent {  
    // 编译错误:无法重写final方法  
    @Override // @Override注解会触发编译器检查,但在这里不适用  
    void show() {  
        System.out.println("Child show()");  
    }  
}

2.static方法不是重写,而是遮蔽

static方法不能被重写,因为在Java中,static方法是类方法,而不是实例方法。如果你在子类中定义了与父类同名的static方法,那么这实际上是在子类中遮蔽了父类的static方法,而不是重写它。

class Parent {  
    static void show() {  
        System.out.println("Parent show()");  
    }  
}  

class Child extends Parent {  
    // 这不是重写,而是遮蔽  
    static void show() {  
        System.out.println("Child show()");  
    }  
}

3.final与static的组合

当一个方法同时被声明为final和static时,它仍然是一个类方法,不能被重写,也不能被子类中的同名方法所遮蔽(因为static方法总是通过类名来引用,所以子类中的同名static方法会被视为新的方法,而不是对父类方法的遮蔽)。但是,由于final的限制,这个组合实际上限制了任何尝试在子类中定义同名方法的尝试,因为final禁止了重写,而static则使得方法调用与实例无关。

class Parent {  
    final static void show() {  
        System.out.println("Parent show()");  
    }  
}  

class Child extends Parent {  
    // 尝试定义同名方法会导致编译错误,因为final禁止了重写,而static使得方法调用与实例无关  
    // static void show() { ... } // 编译错误  
}

4.final与继承

==final类不能被继承。==如果你试图继承一个被声明为final的类,编译器会报错。

final class FinalClass {  
    // ...  
}  

class AnotherClass extends FinalClass {  
    // 编译错误:FinalClass是final的,不能被继承  
}

5.static与继承

虽然static方法不能被重写,==但static变量(字段)是可以被子类继承的。==不过,子类不能直接修改继承自父类的static变量(除非在子类中声明了一个同名的static变量来遮蔽它)。子类可以通过类名来访问父类的static变量,也可以通过子类的类名来访问(如果子类没有遮蔽它的话)。

class Parent {  
    static int value = 10;  
}  

class Child extends Parent {  
    // 这里没有遮蔽Parent.value  
    // Child.value 仍然引用的是 Parent.value  
}

总之,理解final、static以及它们与重写和继承之间的关系对于编写清晰、可维护的Java代码至关重要。


http://www.kler.cn/a/323047.html

相关文章:

  • Python作业05
  • 【redis】—— 环境搭建教程
  • 北京大学c++程序设计听课笔记101
  • GitHub新手入门 - 从创建仓库到协作管理
  • 前后端分离练习(云客项目)
  • Linux之vim全选,全部复制,全部删除
  • io流(学习笔记01)--File知识点
  • Qt常用快捷键
  • 数据结构:串 及串的模式匹配(KMP)
  • 视觉无障碍 | 成都爱尔眼科公益助力重获清晰便利独居人生
  • 阿里rtc旁路推流TypeScript版NODE运行
  • 从入门到精通:计算机视觉学习路线与实战项目推荐
  • ROS与无人驾驶学习笔记(零)——问题汇总
  • Linux基础命令kill详解
  • JBOSS中间件漏洞复现
  • STM32 RTC实时时钟学习总结
  • WordPress精选文章如何添加侧边栏和页面?
  • 计算物理精解【8】-计算原理精解【5】
  • 如何在ChatGPT的帮助下,使用“逻辑回归”技巧完成论文写作?
  • sql server 版本补丁更新
  • Superset二次开发之Git篇git fetch 异常信息汇总
  • 【深度学习基础模型】Variational Autoencoders (VAE) 详细理解并附实现代码。
  • 【基础知识】Go中的同步机制
  • 基于yolov8的辣椒缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • STM32G431RBT6 VREF+与VDDA引脚
  • 计算机性能指标之MIPS