我在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,但是当我尝试从静态方法中的实例cchild访问静态变量x时,编译器会出错,
所以在java中我无法访问静态方法中的对象,即使实例包含静态成员???
好的,但我可以通过cchild访问静态成员,它允许我通过类的名称访问静态成员,为什么我不能通过静态方法中的实例名称访问静态成员?@Johnny Mopp
如果方法不是静态的,我可以通过对象@Abhishek引用静态字段
@kernal我认为你是误解......问题不在于通过cchild访问x ...这可能......问题是在静态函数中访问cchild(非静态)
@Abhishek您的声明:"静态字段只能通过课堂使用。" 不是真的。
好的,我现在明白了,谢谢@Rakesh G R
您需要了解的第一件事是static成员属于class而不是实例,因此可以直接访问,而无需创建对类实例的引用。以下语句访问类sample中的static成员x,其中sample是类名,x是sample中的static成员:
sample.x=0;
另一方面,以下声明不起作用,因为
引用cchild不是static,因此是实例字段,而main是static方法。如果没有引用类的实例,则无法在static方法中访问实例字段。
cchild.x=9
要使上述语句起作用,您可以在JavaApplication1中将cchild声明为static,或者在main中创建JavaApplication1的实例,如下所示:
JavaApplication1 instanceOfJApp = new JavaApplication1();
hild.x=9;
这应该工作。您需要将变量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)的变量。 (在课堂定义中)。通过不标记cchild变量'static',它将成为JavaApplication1类的实例变量,因此只有在通过调用构造函数创建JavaApplication1类的实例时才能使用,而不能在静态创建的main方法中使用。
我在这里建议您将变量更改为静态,以便您可以访问它。我认为这是您取得进步的最简单方法。但是,一般情况下,如果您需要进行这样的更改,可能会显示您需要更多地考虑哪些成员需要是静态的,哪些需要在实例对象上,因此只需将变量设置为静态永远是最好的事情。
在此代码示例中,您可能会采取不同的其他一些操作。首先,我建议您使用Java命名约定,以大写字母(在本例中为Sample而不是示例)启动类的名称,否则它们看起来不像Java人员的类名。
请在答案中添加至少一个简短的解释。 仅限代码的答案仅对完全理解代码的人有帮助 - 而且观众不会研究这个问题。
好的,谢谢你的回答
您可以采取以下措施来解决问题:
使cchild静态
将cchild的声明移动到main方法
非常感谢verey
@kernal,欢迎你! 很高兴我能帮上忙!
这是因为调用
static void main(String[] args){
}
不生成JavaApplication1实例。