在静态方法中访问类的静态成员

时间:2017-01-04 13:44:28

标签: java static

我在java中有这个代码我用netbeans

编写它
class sample
{
    public static int x;
    public int y;
    sample()
    {
        x=0;
    }
}
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    sample cchild=new sample();

    public static void main(String[] args) {
        // TODO code application logic here
        sample.x=0;
        cchild.x=9; // here error
    }

解释样本:

我对示例的类组成,类示例包含静态变量 x ,但是当我尝试访问静态变量时x 来自实例 cchild 的静态方法编译器出错, 所以在java中我无法访问静态方法中的对象,即使实例包含静态成员???

4 个答案:

答案 0 :(得分:3)

这应该有效。您需要将变量cchild声明为JavaApplicaiton1类的静态成员,以便能够静态访问它。

class sample
{
    public static int x;
    public int y;
    sample()
    {
        x=0;
    }
}

public class JavaApplication1 {

    // NEW BIT - by making this variable static we can now access it without needing an instance of the object.
    static sample cchild=new sample();

    public static void main(String[] args) {
        sample.x=0;
        cchild.x=9;
    }
}

Java中的静态意味着它是类本身的属性,而不是该类类型的实例对象的属性。使用非静态属性时,您需要通过调用构造函数创建该类类型的对象,然后您可以使用该对象的引用来调用非静态方法并访问非静态变量。如果您没有该类型对象的副本,则只能调用静态方法并访问静态变量。

原始版本不起作用,因为虽然您尝试从静态上下文(在main方法内部是静态的)内访问静态变量,但您创建了用于访问非静态变量(cchild)的变量。 -static上下文(在类定义中)。通过不标记cchild变量'static',它将成为JavaApplication1类的实例变量,因此只有在通过调用构造函数创建JavaApplication1类的实例时才能使用,而不能在静态创建的main方法中使用。

我在此建议您将变量更改为静态,以便可以访问它。我认为这是您取得进步的最简单方法。但是,一般情况下,如果您需要进行这样的更改,可能会显示您需要更多地考虑哪些成员需要是静态的,哪些需要在实例对象上,因此只需将变量设置为静态永远是最好的事情。

在此代码示例中,您可能会采取不同的其他一些操作。首先,我建议您使用Java命名约定,以大写字母(在本例中为Sample而不是示例)启动类的名称,否则它们看起来不像Java人员的类名。

答案 1 :(得分:3)

您需要了解的第一件事是static成员属于class而不是实例,因此可以直接访问,而无需创建对类实例的引用。以下语句访问类static中的x成员sample,其中sample是类名,xstatic成员sample成员1}}:

  

sample.x = 0;

另一方面,以下陈述不起作用,因为 引用cchild不是static,因此是实例字段,而mainstatic方法。如果没有引用类的实例,则无法在static方法中访问实例字段。

  

cchild.x = 9

要使上述声明有效,您可以在cchild中将static声明为JavaApplication1,或在JavaApplication1中创建main的实例,如下所示:

JavaApplication1 instanceOfJApp = new JavaApplication1();
instanceOfJApp.cchild.x=9;

答案 2 :(得分:2)

您可以采取以下措施来解决问题:

  1. cchild静态

  2. cchild的声明移至您的main方法

答案 3 :(得分:1)

这是因为调用

static void main(String[] args){
}

不会生成JavaApplication1实例。