-3

考虑下面的课程

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

4 回答 4

3

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

这完全是胡说八道。

你只是对语言的语法规则有问题,它说在类体内,你只能有这四件事:

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);
        }
}

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

于 2012-07-30T07:38:52.513 回答
3

-在类范围内,您不能在类范围内执行那样的操作

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

例如:

public void go(){     // Inside a method

      p1.setIt(1);

   }

例如:

{                    // Inside a block

      p1.setIt(1);

  }
于 2012-07-30T07:43:15.703 回答
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);
    }
}
于 2012-07-30T07:35:46.690 回答
-2

而且我认为您的代码中可能还有另一个错误:为什么在类名“Sample”之后使用括号?

于 2012-07-30T07:38:55.050 回答