0

可能重复:
“不能从静态上下文引用非静态方法”背后的原因是什么?

我是 Java 新手。我有以下几组代码。

class Default
{
    private short s;
    private int i;
    private long l;
    private float f;
    private double d;
    private char c;
    private String str;
    private boolean b;

    public static void main (String args[ ])
    {

        Default df = new Default();

        System.out.println("\n Short = "+s);

        System.out.println ("\n int i =" + i);
        System.out.println ("\n long l =" + l );
        System.out.println ("\n float f =" + f);
        System.out.println ("\n double d =" + d);
        System.out.println ("\n char c =" + c);
        System.out.println ("\n String s =" + str);
        System.out.println("\n boolean b =" + b);
    }
}

这会产生一条错误消息作为此问题的主题,但以下代码可以完美运行。

class Default
{
    private short s;
    private int i;
    private long l;
    private float f;
    private double d;
    private char c;
    private String str;
    private boolean b;

    public static void main (String args[ ])
    {

        Default df = new Default();

        System.out.println("\n Short = "+df.s);

        System.out.println ("\n int i =" + df.i);
        System.out.println ("\n long l =" + df.l );
        System.out.println ("\n float f =" + df.f);
        System.out.println ("\n double d =" + df.d);
        System.out.println ("\n char c =" + df.c);
        System.out.println ("\n String s =" + df.str);
        System.out.println("\n boolean b =" + df.b);
    }
}

这给出了期望的结果。这两组代码有什么区别。

4

2 回答 2

2

您有一个Default名为的实例化对象,df它正在调用这些变量。由于您创建的变量不是static,它们必须与已创建的某个对象分开。

Default df = new Default();
df.i //<- is now a part of the instantiated object df.

static如果关键字不与对象一起使用,则使用关键字。所以你可以说:

private static char c;

然后你可以char c随时调用,这将是null因为你还没有给它一个值。

static将在没有对象的情况下使用该变量或方法时使用。

于 2012-11-19T23:19:17.250 回答
0

两组代码之间的区别在于,在第二个示例中,您有一个类的实例,当您说Default df = new Default();.

您已将Default类中的所有变量声明为实例级变量,这意味着为了访问它们,您必须通过类的特定实例。或者换一种说法,你的类的每个实例都有自己的一组变量,所以编译器知道你实际访问的是哪个实例的唯一方法是你先指定你想使用的实例。

例如,您可以这样做:

Default df = new Default();
Default anotherOne = new Default();

df.s = 1;
anotherOne.s = 2;

System.out.println("\n Short(df) = "+df.s);                  //'1'
System.out.println("\n Short(anotherOne) = "+anotherOne.s);  //'2'

尝试直接从main()(或从任何其他静态方法)访问实例变量的问题在于该main()方法不直接与您的类的任何实例相关联。所以在这种情况下,编译器不知道从哪个实例中获取变量,除非您明确指定一个。

当然,您可以将变量设置为静态,但是无论您创建多少个实例,您都只需为该类设置一组变量,而不是每个实例的一组值。在这种情况下,示例中的代码 about 仍然会编译和运行(尽管它会/应该产生编译器警告),但两个语句都会打印“2”,因为s每个实例只有一个变量而不是一个变量类的。

于 2012-11-19T23:34:40.250 回答