为什么我不能在类块中调用实例变量的方法?

时间:2012-07-30 07:28:58

标签: java oop

考虑以下课程

public class Player {

private int id;
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}
}

假设同一个包中有另一个类

public class Sample {
    Player p1 = new Player();
    Player p2 = new Player();
    Player p3 = new Player();
    Player p4 = new Player();
    //p1.
}

在此类中,除非在另一个方法中调用,否则无法访问方法p1.setId(int)

public class Sample {
    Player p1 = new Player();
    Player p2 = new Player();
    Player p3 = new Player();
    Player p4 = new Player();

    void example () {
        int x;
        p1.setId(x);                
    }
}

内部示例p1.setId()是可能的。我明白java是  只允许在另一个方法中访问方法。所以它更多  安全。但我想澄清为何这样的限制  那里和什么概念数据抽象或封装显示  这个限制。提前谢谢。

4 个答案:

答案 0 :(得分:3)

  

我知道java只允许在另一个方法中访问方法。所以它更安全

这完全是废话。

您只是在语言的语法规则方面遇到问题,这些规则说明在类体内you can have only these four things:

ClassMemberDeclaration
InstanceInitializer
StaticInitializer
ConstructorDeclaration

你不能只在类中放入任何代码,而不是如何定义类。您可以使用实例初始化程序。这有效:

public class Sample()
{
        Player p1 = new Player();
        Player p2 = new Player();
        Player p3 = new Player();
        Player p4 = new Player();

        {
            p1.setInt(2);
        }
}

但通常不会这样做,因为构造函数更适合实例初始化。

答案 1 :(得分:3)

- 在课堂范围内,您无法在课程范围内执行此类操作

- 要么必须是inside a method,要么是inside a block

<强>例如

public void go(){     // Inside a method

      p1.setIt(1);

   }

例如:

{                    // Inside a block

      p1.setIt(1);

  }

答案 2 :(得分:2)

因为您尝试在类块中执行操作,其中应定义方法和变量。

如果你真的想设置这个属性,请使用块。

public class Sample() {
    Player p1 = new Player();
    {
        p1.setId(1);
    }
}

我认为更好的情况是使用一些将从构造函数调用的初始化方法。

public class Sample() {
    Player p1 = new Player();
    public Sample() {
        init();
    }
    private init(){
        p1.setId(1);
    }
}

答案 3 :(得分:-2)

我觉得你的代码可能还有另一个错误:为什么在课名“Sample”后使用括号?