Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跨包访问字段_Java_Android - Fatal编程技术网

Java 跨包访问字段

Java 跨包访问字段,java,android,Java,Android,如何在包中访问字段?目前,即使它们被声明为公共,我也无法从同一个包中的另一个类访问这些字段。应编译以下代码。第二类可以访问第一类中的字段。如果有差异,请检查您自己的 package one; public class A { public int fieldA; } package pkg; public class One { public int fieldOne; } 这里有一个更合适的例子。(基于@Andreas_D的例子……似乎这并不明显!) 请注意,导入不是引用同一

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

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

package one;

public class A {
  public int fieldA;
}
package pkg;

public class One {
  public int fieldOne;
}


这里有一个更合适的例子。(基于@Andreas_D的例子……似乎这并不明显!)

请注意,导入不是引用同一包中声明的类所需的

package pkg;

public class One {
  public int 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); 
   }
}
公共A类{
公共int计数器;
私人int计数器2;
public int getCounter2(){return counter2;}
public void setCounter2(int c){counter2=c;}
}
公共类B扩展了A{
公共无效设置计数器2(内部c){
如果(c<0)抛出新的IllegalArgumentException(“计数器2不能为负”);
super.setCounter2(c);
}
}
比较
计数器
计数器2
属性的行为方式。对于
计数器
,任何类中的任何代码都可以不受限制地读取或更新属性。这既适用于类
A
的实例,也适用于扩展
A
的任何类。如果其他类决定将
计数器设置为错误值。。。没有什么可以阻止它

counter2
的情况下,
A
实例的属性只能分别通过
getCounter2
setCounter2
方法读取或更新。如果我愿意,我可以在
A
中更改这些方法来进行验证、执行访问检查、通知某些侦听器状态更改等等。因为这种行为只能发生在
A
的方法中,所以我知道在发生奇怪的事情时从哪里开始寻找


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

不应该是这样。请发布代表您的问题的代码。如果它们在同一个包中,您应该能够访问它们-您可以发布一些代码(有问题的两个类)。可能您需要导入这些类。我使用奔腾10。否则,我们可以为该类创建对象。您可以使用obj.fieldname;。这样地。您可以检查字段/变量是否声明为private。@Pentium10-如果某个类与此类在同一个类中,则不需要导入该类。这应该是
import one.one
和在同一类中使用相同名称的包和属性是不必要的混淆。但是,我不能在类a中有一个可以被类B直接访问的公共成员(我的意思是不需要类a的实例)。类别A和B属于同一个包。根据访问权限,这应该是可能的,对吗?@Namratha-是的,没错。你试过编译我的例子吗?是的。你的代码编译得很好。我只是不明白为什么我会有问题。请看下面我的代码。这是我的代码:类A扩展活动{public boolean flag=false;}类B扩展ListActivity{if(flag)//这里的错误:无法解析标志}A和B属于同一个包,并且我还在B.java文件中包含了import org.example.Myapp.A行。如果不实例化,我无法访问字段,可以吗?如果必须的话,我必须让它静止?如何使字符串变量为静态?我知道了。只需在字符串之前附加“static”。我不想使用任何实例,因为无论我做什么操作,都必须只使用该实例。我说得对吗?
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); 
   }
}