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

问题描述:

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

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

是'Sample'应该是一个类? – verdesmarald 2012-07-30 07:31:09

+0

是的..我编辑了 – Meenakshi 2012-07-30 07:32:29

+1

您可以请删除空行并正确缩进您的代码。 – Keppil 2012-07-30 07:32:29

据我所知,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); 
     } 
} 

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

+0

谢谢@Michael Borgwardt – Meenakshi 2012-07-30 07:43:37

+0

什么是空括号的快捷方式?我以前从未见过这个... – 2012-07-30 07:43:56

+0

@PetrMensik那些空括号作品..我也在第一次在这个讨论中听到了它 – Meenakshi 2012-07-30 07:45:19

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

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

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

是的,它的工作原理..但是y是它的限制,否则 – Meenakshi 2012-07-30 07:38:33

+0

我认为这是面向对象的想法,你有状态(变量)和行为(方法)的类,并没有别的假设。 – mishadoff 2012-07-30 07:44:37

我认为你的代码可能存在另一个错误:为什么在类名“Sample”后面使用圆括号?

-在类的范围内,你不能那样进行操作,在类范围

-要么它必须是inside a methodinside a block

如:

public void go(){  // Inside a method 

     p1.setIt(1); 

    } 

如:

{     // Inside a block 

     p1.setIt(1); 

    }