访问包中的字段

时间:2010-07-06 08:43:52

标签: java android

如何在整个包中访问字段?目前,即使它们被声明为public,我也无法访问同一包中另一个类的字段。

2 个答案:

答案 0 :(得分:0)

以下代码应该编译。第二类可以访问第一类中的字段。如果有差异,请检查一下。

package one;

public class A {
  public int fieldA;
}

package two;
import one.A;

public class B {
  private A a;
  public int getA() {
    return a.fieldA;
  }
}

答案 1 :(得分:0)

这是一个更恰当的例子。 (根据@ Andreas_D的例子......好像不是很明显!)

请注意,引用同一个包中声明的类需要

package pkg;

public class One {
  public int fieldOne;
}

package pkg;

public class Two {
  private One one;
  public int getOne() {
    return one.fieldOne;
  }
}

话虽如此,引用另一个类中声明的公共属性通常是个坏主意。最好将属性声明为private,并通过getter和setter方法访问它们。 (如果属性是公开的,并且它们不是最终的,那么任何东西都可以修改它们。此外,子类无法隐藏属性或改变它们的行为方式。)

修改

说明最后一点:

public class A {
   public int counter;
   private int counter2;
   public int getCounter2() { return counter2; }
   public void setCounter2(int c) { counter2 = c; }
}

public class B extends A {
   public void setCounter2(int c) {
      if (c < 0) throw new IllegalArgumentException("counter2 cannot be negative");
      super.setCounter2(c); 
   }
}

比较countercounter2属性的行为方式。在counter的情况下,任何类中的任何代码都可以无限制地读取或更新属性。这适用于类A的实例和任何扩展A的类。如果其他一些类决定将counter设置为错误值......那么就没有什么可以阻止它了。

对于counter2A实例的属性只能分别由getCounter2setCounter2方法读取或更新。如果我愿意,我可以在A中更改这些方法以进行验证,执行访问检查,通知某些侦听器状态更改等等。而且因为这种行为只能在A的方法中发生,所以我知道在发生奇怪事件时从哪里开始查看。

如果我定义了A的子类(例如B),我可以覆盖其中一种或两种方法做不同的事情。但请注意,由于我决定将实际属性声明为private,因此B中的setCounter2方法仍然必须在其超类中调用该方法。这也很好。