2

每当我们使用静态时,我们都不需要创建类的引用变量。我们可以通过以下方式直接访问类<class_name>

但是当我们编写以下代码时:

class Abc
{
    static void show()
    {
        System.out.println("Hey I am static");
    }
}

class Test
{
    public static void main(String args[])
    {
        Abc.show();            //1
        new Abc().show();      //2
    }
}

第 1 行和第 2 行如何工作。有什么意义

new Abc().show();
4

5 回答 5

3

使用实例(尽管它有效)是调用方法(或访问静态字段)的错误方式,因为 static 表示它是类/类型的成员,而不是实例。static

因此,编译器将用Class类型替换实例(由于静态绑定)。换句话说,在运行时ABC.show()被执行而不是new ABC().show().

但是,您的源代码仍然看起来令人困惑。因此,它被认为是一种不好的做法,甚至会导致来自 Eclipse 等 IDE 的警告。

于 2013-06-11T10:50:19.800 回答
0

由于您的 ABC 类没有覆盖默认构造函数。

它相当于:

class Abc{
    public Abc(){super();}

    static void show(){
         System.out.println("Hey I am static");
    }
}

因此,通过这样做new Abc().show();,您只是为您的类创建了一个新的 Abc 对象,并通过该对象调用 ABC 类的静态方法(它会显示警告,因为这不是调用静态方法的正确方法)。

于 2013-06-11T10:50:18.697 回答
0

static 关键字建议每个类只有一个副本,现在您已经创建方法 static 并且您正在使用 Classname.methodname() 进行访问,这是适当的方式,因为当类加载到 JVM 时,将创建其实例,因此无需显式创建班级。希望它有意义。

于 2013-06-11T10:52:51.787 回答
0

您可以使用实例中的静态方法,如new Abc().show(),但它可能会造成混淆,因此不推荐。

坚持className.staticMethod()使用静态方法和classInstance.instanceMethod()其他方法。

于 2013-06-11T10:50:32.643 回答
0

这很简单意味着您正在为 ABC 创建对象,而不是尝试通过对象访问此变量。

然而,在编译时,

new Abc().show(); 

被转换为Abc.show().

于 2013-06-11T10:51:59.080 回答