如果仍然无法在包含类的外部访问它,则在Java中声明私有内部类的成员的原因是什么? 可以吗
public class DataStructure {
// ...
private class InnerEvenIterator {
// ...
public boolean hasNext() { // Why public?
// ...
}
}
}
如果InnerEvenIterator类没有扩展任何类或实现任何接口,则我认为这是无稽之谈,因为没有其他类可以访问它的任何实例。
但是,如果它扩展或实现了任何其他非私有类或接口,则很有意义。一个例子:
interface EvenIterator {
public boolean hasNext();
}
public class DataStructure {
// ...
private class InnerEvenIterator implements EvenIterator{
// ...
public boolean hasNext() { // Why public?
// ...
}
}
InnerEvenIterator iterator;
public EvenIterator getIterator(){
return iterator;
}
}
因此,作为一般规则,没有类成员访问修饰符可以优先于成员类的访问修饰符。那是对的吗?
尽管在特定情况下编译器不强制执行可见性规则,但也可以将该方法设为public,以表明它在语义上是公共的。
想象一下,在进行一些重构时,您需要使该内部类成为顶级。如果此方法为private,您将如何决定应将其设置为public,还是应使用限制性更强的修饰符?将方法声明为public可以告诉读者原始作者的意图-不应将此方法视为实现细节。
这正是我在嵌套类中使用public和private的方式!为什么我们使用可以从外部调用的私有方法以不同的方式编写嵌套类?我通常感觉外层类不应调用内层类的私有方法,而只能调用公共方法,即使编译器不强制执行此方法。另外,您以后可以将嵌套类重构为顶级类,而不必将私有方法更改为public。
当您实现任何interface时,它很有用。
class DataStructure implements Iterable {
@Override
public Iterator iterator() {
return new InnerEvenIterator();
}
// ...
private class InnerEvenIterator implements Iterator {
// ...
public boolean hasNext() { // Why public?
// ...
return false;
}
@Override
public DataStructure next() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
}
public static void main(String[] ex) {
DataStructure ds = new DataStructure();
Iterator ids = ds.iterator();
ids.hasNext(); // accessable
}
}
我认为您在示例代码中缺少实现Iterator接口的部分。在那种情况下,您不能使hasNext()方法具有除public以外的任何其他可见性标识符,因为这最终会降低其可见性(接口方法具有公共可见性)并且将无法编译。
访问修饰符有很多组合,这些组合没有用。私有内部类中的公共方法仅在其在公共类/接口中实现公共方法时才有用。
public class DataStructure {
// ...
private class InnerEvenIterator implements Iterator {
// ...
public boolean hasNext() { // Why public?
// ...
}
}
public Iterator iterator() {
return new InnerEvenIterator();
}
}
顺便说一句:抽象类实际上是protected时,它们通常具有public构造函数
它不是关于"有用"的。您只是没有实现接口的选择。 :-)
这是真的,但我的意思是:如果您没有实现或重写公共方法,则该方法不需要是公共的,并且可以具有私有类的私有作用域。如果无法public对其进行访问并且可能引起误解或混淆,则将其设置为public没用。
如果内部类是私有的,则不能通过外部类外部的名称进行访问。内部和外部类可以访问彼此的私有方法和私有实例变量。只要您在内部或外部类中,修饰符public和private具有相同的效果。在您的代码示例中:
public class DataStructure {
// ...
private class InnerEvenIterator {
// ...
public boolean hasNext() { // Why public?
// ...
}
}
}
就DataStructure类而言,这完全等同于:
public class DataStructure {
// ...
private class InnerEvenIterator {
// ...
private boolean hasNext() {
// ...
}
}
}
这是因为只有DataStructure可以访问它,所以将其设置为public还是private都没有关系。无论哪种方式,DataStructure仍然是唯一可以访问它的类。使用任何您喜欢的修饰符,都不会产生功能差异。唯一不能随机选择的时间是在实施或扩展时,在这种情况下,您不能减少访问,但可以增加访问。因此,如果抽象方法具有受保护的访问权限,则可以将其更改为public。当然,任何人都没有任何实际作用。
如果计划在其他类中使用内部类并因此将其公开,则可能一开始就不应将其设为内部类。
另外,我看不到内部类扩展或实现其他类的任何要求。对他们而言,这样做可能很普遍,但是当然不是必需的。
在这种情况下,private和public之间存在一些差异:非私有方法可以被其他内部类覆盖,而私有内部方法则不能。