无法从辅助类访问公共非静态类属性

时间:2012-05-20 19:54:29

标签: java

我有以下两个类:

public class Class1
{
    public Class1 randomvariable; // Variable declared

    public static void main(String[] args)
    {
        randomvariable = new Class1(); // Variable initialized
    }
}

public class Class2
{
    public static void ranMethod()
    {
        randomvariable.getSomething(); // I can't access the member "randomvariable" here even though it's public and it's in the same project?
    }
}

我很确定这是我在这里遗失的一件非常基本的事情,但实际上我错过了什么? Class1成员“randomvariable”是公共的,类也是如此,两个类都在同一个项目中。 我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:7)

有两个问题:

首先,您尝试从randomvariablemain分配值,而不存在Class1的实例。这在实例方法中是可以的,因为randomvariable将隐式this.randomvariable - 但这是一个静态方法。

其次,您尝试从Class2.ranMethod读取值,同时没有涉及Class1的实例。

了解实例变量是很重要的。它是与类的特定实例相关联的值。因此,如果您有一个名为Person的类,则可能有一个名为name的变量。现在在Class2.ranMethod,你实际上是在写:

name.getSomething();

这没有任何意义 - 首先,根本没有将此代码与Person相关联,其次没有说涉及哪个人。

同样在main方法中 - 没有实例,所以你没有上下文。

以下是 工作的替代程序,因此您可以看到差异:

public class Person {
    // In real code you should almost *never* have public variables
    // like this. It would normally be private, and you'd expose
    // a public getName() method. It might be final, too, with the value
    // assigned in the constructor.
    public String name;

    public static void main(String[] args) {
        Person x = new Person();
        x.name = "Fred";
        PersonPresenter.displayPerson(x);
    }
}

class PersonPresenter {

    // In a real system this would probably be an instance method
    public static void displayPerson(Person person) {
        System.out.println("I present to you: " + person.name);
    }
}

正如您在评论中所说,这仍然不是理想的代码 - 但我希望保持与原始代码非常接近。

但是,这现在有效:main正在尝试为特定实例设置实例变量的值,同样presentPerson也会为实例提供引用作为参数,它可以找出该实例的name变量的值

答案 1 :(得分:1)

当您尝试访问randomvariable时,您必须指定它所在的位置。由于它是非静态类字段,因此您需要Class1的实例才能拥有randomvariable。例如:

Class1 randomclass;
randomclass.randomvariable.getSomething();

如果它是一个静态字段,意味着每个类只存在一个而不是每个实例存在一个,则可以使用类名访问它:

Class1.randomvariable.getSomething();