java静态成员方法_关于java:在静态方法中访问类的静态成员

本文讨论了Java中静态方法无法直接访问非静态成员的问题,特别是在尝试通过实例对象访问静态成员时出现的编译错误。文章通过一个代码示例说明,静态成员属于类本身,而非实例,因此在静态方法中只能通过类名直接访问。解决方案包括将变量声明为静态或在非静态上下文中创建对象实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在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();

instanceOfJApp.cchild.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实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值