栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么通过实例调用静态方法对于Java编译器来说不是错误?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么通过实例调用静态方法对于Java编译器来说不是错误?

基本上,我相信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 pre        // 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被完全忽略。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/411018.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号