我在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中我无法访问静态方法中的对象,即使实例包含静态成员???
答案 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
是类名,x
是static
成员sample
成员1}}:
sample.x = 0;
另一方面,以下陈述不起作用,因为
引用cchild
不是static
,因此是实例字段,而main
是static
方法。如果没有引用类的实例,则无法在static
方法中访问实例字段。
cchild.x = 9
要使上述声明有效,您可以在cchild
中将static
声明为JavaApplication1
,或在JavaApplication1
中创建main
的实例,如下所示:
JavaApplication1 instanceOfJApp = new JavaApplication1();
instanceOfJApp.cchild.x=9;
答案 2 :(得分:2)
您可以采取以下措施来解决问题:
让cchild
静态
将cchild
的声明移至您的main
方法
答案 3 :(得分:1)
这是因为调用
static void main(String[] args){
}
不会生成JavaApplication1实例。