你能用Java覆盖静态方法吗?如果我在子类中创建相同的方法是编译时错误?
2024-09-03 03:12:26
不,你不能在Java中覆盖静态方法,但在子类中声明一个完全相同的方法不是编译时错误,这称为隐藏在Java中的方法。你不能覆盖Java中的静态方法,因为方法覆盖基于运行时的动态绑定,静态方法在编译时使用静态绑定进行绑定。虽然可以在子类中声明一个具有相同名称和方法签名的方法,看起来可以在Java中覆盖静态方法,但实际上这是方法隐藏。Java不会在运行时解析方法调用,并且根据用于调用静态方法的 Object 类型,将调用相应的方法。这意味着如果你使用父类的类型来调用静态方法,那么原始静态将从父类中调用,另一方面如果你使用子类的类型来调用静态方法,则会调用来自子类的方法。简而言之,你无法在Java中覆盖静态方法。如果你使用像Eclipse或Netbeans这样的Java IDE,它们将显示警告静态方法应该使用类名而不是使用对象来调用,因为静态方法不能在Java中重写。
/**
*
* Java program which demonstrate that we can not override static method in Java.
* Had Static method can be overridden, with Super class type and sub class object
* static method from sub class would be called in our example, which is not the case.
*/
public class CanWeOverrideStaticMethod {
public static void main(String args[]) {
Screen scrn = new ColorScreen();
//if we can override static , this should call method from Child class
scrn.show(); //IDE will show warning, static method should be called from classname
}
}
class Screen{
/*
* public static method which can not be overridden in Java
*/
public static void show(){
System.out.printf("Static method from parent class");
}
}
class ColorScreen extends Screen{
/*
* static method of same name and method signature as existed in super
* class, this is not method overriding instead this is called
* method hiding in Java
*/
public static void show(){
System.err.println("Overridden static method in Child Class in Java");
}
}
输出:
Static method from parent class
此输出确认你无法覆盖Java中的静态方法,并且静态方法基于类型信息而不是基于Object进行绑定。如果要覆盖静态mehtod,则会调用子类或 ColorScreen 中的方法。这一切都在讨论中我们可以覆盖Java中的静态方法。我们已经确认没有,我们不能覆盖静态方法,我们只能在Java中隐藏静态方法。创建具有相同名称和mehtod签名的静态方法称为Java隐藏方法。IDE将显示警告:"静态方法应该使用类名而不是使用对象来调用", 因为静态方法不能在Java中重写。
最新文章
- PHP导出数据库方法
- 在C++中实现字符串分割--split
- JQuery怎么实现页面刷新后保留鼠标点击样式的方法
- MES取所有部门的函数实例
- Ubuntu 下 glpk 的安装及使用
- JS实现复制到剪贴板
- php中jsonp的跨域实例
- jQuery/CSS3实现图片层叠展开特效
- iOS开发网络数据之AFNetworking使用1
- Linux Debian 7部署LEMP(Linux+Nginx+MySQL+PHP)网站环境
- .9-浅析express源码之请求处理流程(2)
- imagecreatefrombmp、imagebmp php处理bmp文件
- springboot 添加 jsp支持
- 走进JDK(十一)------LinkedHashMap
- python学习笔记--文件重命名,删除及文件夹
- python js(JavaScript)初识
- java方法重载和重写
- javascript基础知识学习
- python记录_day25 包
- Netty Reator(二)Scalable IO in Java