为什么静态方法不能直接访问由非静态方法更改的值

时间:2014-10-31 04:51:55

标签: java

public class JustPractice {

    public int points=0;

    public static void main(String args[]) {
        JustPractice ha = new JustPractice();
        ha.end();
        happy();
    }

    public void end() {
        this.points=100;
        System.out.println(points);
    }

    public static void happy() {
        JustPractice object = new JustPractice();
        System.out.println(object.points);
        return;
    }

}

以上显示:

  

100
0

然而它应该显示:

  

100
100

6 个答案:

答案 0 :(得分:6)

您正在查看班级的两个不同实例。

每个实例都获得自己的实例字段副本,并且它们彼此完全独立。

JustPractice ha = new JustPractice();
ha.end();    // this one has "100"

JustPractice object = new JustPractice();  // this one has "0"
System.out.println(object.points);   

如果您使用ha作为参数提供,则静态方法只能访问ha的实例字段。

答案 1 :(得分:2)

制作points static。然后你得到了你想要的东西。

public static int points=0;

make points static只会为您班级的所有实例保留一个变量。

否则,每次初始化都会创建单独的单个变量,并将值赋给0

答案 2 :(得分:2)

因为当方法正在创建新对象时,那时它将拥有另一个副本,因为reference object将为每个类的对象提供独立的副本,还记得java基础吗?

如果你将int作为static对象,那么它将为你的输出提供你想要的东西以及你要求你提供的简单例子

public static int points = 0;


    public void end() {
        this.points = 100;
        System.out.println(points);
    }

    public static void happy() {
        CheckingClass object = new CheckingClass();
        System.out.println(object.points);
        return;
    }

    public static void main(String args[]) {
        CheckingClass ha = new CheckingClass();
        ha.end();
        happy();
    }

希望它有用

答案 3 :(得分:0)

静态方法可以访问非静态对象,但前提是它只是传递给方法。鉴于所讨论的静态方法是程序开始的方法,您无法向其传递任何内容。

在非静态类的范围内,它无法访问任何实例成员或函数。问题不是你从静态方法中实例化ha,而是你正在访问成员点,这是一个属于你的类的每个实例的实例成员。

为了解决这个问题,您可以将点传递给您正在创建的JustPractice(ha)实例,并使JustPractice方法之一返回最终值,或者您可以创建点数,end()和happy()静态,在这种情况下,所有人都可以彼此愉快地工作。

答案 4 :(得分:0)

它显示为100 0而不是100 100,因为您正在happy()方法中创建类JustPractice的新实例,而不是传递引用,即现有实例的ha。

新创建的新实例显示您在班级中提供的默认值,即0。

答案 5 :(得分:0)

在end方法中设置points实例变量的值。对于happy方法中的对象,不要初始化object的points实例变量。

因此它获得默认值0。