gpt4 book ai didi

java - 为什么通过实例调用静态方法不是 Java 编译器的错误?

转载 作者:IT老高 更新时间:2023-10-28 11:49:41 27 4
gpt4 key购买 nike

我相信你们都知道我的意思 - 代码如:

Thread thread = new Thread();
int activeCount = thread.activeCount();

引发编译器警告。为什么不是错误?

编辑:

要明确:问题与线程无关。我意识到在讨论这个问题时经常会给出 Thread 示例,因为它们有可能真的把事情搞砸了。但真正的问题是,这种用法总是是胡说八道,你不能(有能力)写出这样的电话并认真对待。这种类型的方法调用的任何例子都是愚蠢的。这是另一个:

String hello = "hello";
String number123AsString = hello.valueOf(123);

这使得每个 String 实例看起来都带有一个“String valueOf(int i)”方法。

最佳答案

基本上,我认为 Java 设计者在设计语言时犯了一个错误,由于涉及的兼容性问题,现在修复它为时已晚。是的,它会导致非常误导的代码。是的,你应该避免它。是的,您应该确保您的 IDE 配置为将其视为错误,IMO。如果您自己设计过一种语言,请记住它作为要避免的事情的示例:)

只是为了回应 DJClayworth 的观点,这是 C# 中允许的:

public class Foo
{
public static void Bar()
{
}
}

public class Abc
{
public void Test()
{
// Static methods in the same class and base classes
// (and outer classes) are available, with no
// qualification
Def();

// Static methods in other classes are available via
// the class name
Foo.Bar();

Abc abc = new Abc();

// This would *not* be legal. It being legal has no benefit,
// and just allows misleading code
// abc.Def();
}

public static void Def()
{
}
}

为什么我认为它具有误导性?因为如果我查看代码 someVariable.SomeMethod(),我希望它使用 someVariable 的值。如果 SomeMethod() 是静态方法,则该期望无效;代码在欺骗我。这怎么可能是一件好事

奇怪的是,Java 不允许您使用可能未初始化的变量来调用静态方法,尽管事实上它要使用的唯一信息是变量的声明类型。这是一个不一致和无益的困惑。为什么允许呢?

编辑:此编辑是对 Clayton 的回答的回应,该回答声称它允许继承静态方法。它没有。静态方法不是多态的。这是一个简短但完整的程序来证明这一点:

class Base
{
static void foo()
{
System.out.println("Base.foo()");
}
}

class Derived extends Base
{
static void foo()
{
System.out.println("Derived.foo()");
}
}

public class Test
{
public static void main(String[] args)
{
Base b = new Derived();
b.foo(); // Prints "Base.foo()"
b = null;
b.foo(); // Still prints "Base.foo()"
}
}

如您所见,b 的执行时间值被完全忽略。

关于java - 为什么通过实例调用静态方法不是 Java 编译器的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/610458/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com