我有以下两个类:
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”是公共的,类也是如此,两个类都在同一个项目中。 我该怎么做才能解决这个问题?
答案 0 :(得分:7)
有两个问题:
首先,您尝试从randomvariable
向main
分配值,而不存在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();