1
package shubh;
class thread5
{
    static class a7 extends Thread
    {
        public void run()
        {
            for(int i=0;i<=10;i++)
            {
                System.out.println(i);
            }
        }
    }

    static class a8 implements Runnable
    {
        public void run()
        {
            for(int i=21;i<=30;i++)
            {
                System.out.println(i);
            }
        }
    }

    public static void main(String arg[])
    {
        a7 a=new a7();
        a.start();
        a8 b=new a8();
        Thread th=new Thread(b);
        th.start();
        for(int i=40;i<=50;i++)
        {
            System.out.println(i);
        }
    }
}

当我从 2 个嵌套类中删除 static 关键字时,它给出错误non static variable cannot be referenced from a static context谁能解释我这个错误的含义或为什么有必要将嵌套类作为静态

4

4 回答 4

6

如果你删除static,那么你需要一个实际的对象来实例化内部类。IE
new thread5().new a7();

于 2012-12-26T20:33:41.843 回答
1

非静态内部类只能在类的实例实例化,例如:

thread5 t = new thread5();
a7 a = t.new a7();
于 2012-12-26T20:35:21.193 回答
0

当我从 2 个嵌套类中删除 static 关键字时,它给出错误 non static variable cannot be referenced from a static context

您不能从静态方法直接访问非静态数据/方法/类,您需要一个类的实例来访问它们。

如果你删除类 a7 的静态,你应该像这样创建 a7 实例。

Threads5 td = new Threads5()';
a7 a=new td.new a7();
于 2012-12-26T20:34:22.797 回答
0

在这篇 Javarevisited 文章中找到了答案

现在在找到编译器错误“无法从静态上下文引用非静态变量”的答案之前,让我们快速修改一下静态。Java中的静态变量属于Class,并且它的值对于所有实例都保持不变。另一方面,在将类加载到 JVM 时初始化静态变量,实例变量对于每个实例具有不同的值,并且它们是在使用 new() 运算符或使用反射(如 Class.newInstance())创建对象实例时创建的。因此,如果您尝试在没有任何实例的情况下访问非静态变量,编译器会抱怨,因为这些变量尚未创建,并且在创建实例并且它们与任何实例关联之前它们不存在。

总之,由于即使不创建任何类实例也可以运行静态上下文中的代码,因此为尚未创建的特定实例询问值是没有意义的。

于 2012-12-26T20:35:06.930 回答