java - 从实例引用 Java 中的静态方法/变量

标签 java static instance

谁能向我解释为什么 java 允许您从实例访问静态方法和成员?一个不好的例子,如果我有一个名为 RedShape 的类,它有一个名为 getColor() 的静态方法,它返回“red”,为什么 java 允许您从 RedShape 的实例调用静态方法?对我来说,这似乎违反了 OO 语言设计的一些核心概念。至少,它应该带有编译器警告。

提前致谢。

编辑:

特别是,我想问你什么时候有类似的事情

RedShape test = new RedShape();
test.getColor();

其中 getColor 是 RedShape 类的静态方法。这没有任何意义,它被允许并且不会通过 javac 在命令行上给出编译器警告。我看到它“强烈反对”,但很好奇是否有技术或合理的原因允许它在“因为 C++ 允许它”之外的原因。

最佳答案

实例调用静态方法我没有发现任何问题。这有什么问题吗?特别是,经常有一些方法在类的逻辑中很有用,但实际上不需要操作实例本身。

确实反对通过实例引用调用静态方法。经典例子:

Thread thread = new Thread(...);
thread.sleep(5000); // Doesn't do what it looks like

这在某些 IDE 中带有编译器警告 - 当然在 Eclipse 中,假设您打开它。 (Java/编译器/错误和警告/代码风格/对静态成员的非静态访问。)我个人认为 是 Java 设计中的一个错误。 (这是 C# 设法避免复制的错误之一。)

关于java - 从实例引用 Java 中的静态方法/变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1439834/

相关文章:

java - 以排序方式添加到哈希表 (Java)

android - Android 中的静电安全吗?

切换场景的 JavaFX 问题

C++:使方法每次都返回相同的对象

c++ - 如何用C++获取MongoDB的当前实例?

java - 检查我是否可以删除文件

java - HQL order by 两个不同的字段

java - Java HashMap 的排序迭代

objective-c - 我需要一个很好的类比来理解类方法与实例方法

c# - 如何实例化在 C# DLL 中声明的类?