java - 在 Java 中重载和覆盖静态和非静态方法
问题描述
我试图了解重载和覆盖静态和非静态方法的工作原理。事实上,我试图了解这些方法通常如何出现在父类和子类中,也不能出现在父类和子类中。我想出了以下规则:
- 我们不能覆盖静态方法,而是隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,这与覆盖不同(在运行时根据实例类型选择执行哪个方法)。
例如让class B extends A
,然后static B.method()
隐藏static A.method()
。 - 我们可以覆盖实例方法。
例如B.method()
覆盖A.method()
。 - 具有相同签名的两个或多个方法不能以静态或非静态的任何组合存在于同一类中。
egB
不能同时包含static method(float)
和method(float)
。 - 两个或多个具有不同签名的方法可以以静态或非静态的任意组合存在于同一个类中。
egB
可以包含static method()
,static method(int)
和method(float)
- 静态方法不能覆盖非静态方法。
例如B.method()
不能覆盖static B.method()
- 非静态方法不能覆盖静态方法。
例如static B.method()
不能覆盖B.method()
我对这些观察结果正确吗?我也错过了任何规则吗?
解决方案
规则 :
Polymorphism
适用于覆盖,而不是重载。Overriding
是运行时概念,而重载是编译时概念。
多态性 -> 真实对象类型 @runtime(而不是引用变量的类型)决定了使用哪种overridde
方法。相反,引用类型决定了overload
在编译时使用哪种方法。
关于静态方法:它们不能被覆盖 ,但它们可以在 Java中被重载和隐藏
推荐阅读
- xpages - 使用 POI4XPAGES 的 MS Word
- sql - 根据ip地址限制sql表的写权限
- function - 将另一个文件的非类函数访问到 Kotlin 中的类函数中
- permissions - Google Big Query:如何获得更改数据集授权的授权
- python-2.7 - IndexError:python2.7中的字符串索引超出范围
- c# - UWP 中的 NetworkAdapter.NetworkAdapterID 是如何生成的?
- flutter - 在 Flutter 应用程序中创建 dart udp 或 tcp 服务器
- browser - 我可以检测它是移动设备还是桌面设备,但我想进一步检测哪个移动浏览器正在访问 URL?
- python - 在 .next 函数之后使用 [...] 是什么意思?
- javascript - 我想显示输入文件名而不是完整路径