考虑以下课程
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是 只允许在另一个方法中访问方法。所以它更多 安全。但我想澄清为何这样的限制 那里和什么概念数据抽象或封装显示 这个限制。提前谢谢。
答案 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”后使用括号?