也许我没有正确地说出这个问题。以下是我的代码示例:
//a generic binary tree class
public class BinaryTree<T extends Comparable<T>> {
//inner node class
private final static class Node<T>{
//code
}
private Node<T> root; //instance variable for this class
//methods
//assume setters/getters for the root
}
//MyTree class. I am extending it because I want to use all of the
//methods in the BinaryTree class and then some more methods that apply
//only to this class
class MyTree extends BinaryTree<Student> {
void aMethod(){
//I want to be able to do this but I get errors about trying to access a private class
Node<Student> node = root;
}
public static void main(String[] args) {
}
}
class Student implements Comparable<Student> { //implemented method here }
在上面的示例中,我希望能够访问MyTree类中的根。我怎样才能做到这一点?也许有更好的方法来设置它?我认为最好取出内部Node类并使其成为自己的类?
答案 0 :(得分:2)
//inner node class
private final static class Node<T>{
//code
}
public Node<T> root; //instance variable for this class
root
不是内部类的成员,它是公共的,因此您已经可以从任何类访问它,而不仅仅是{{1}的子类}。你确定变量应该公开且可变吗?
但是要回答你的问题,内部类BinaryTree
必须是公共的或受保护的,以便可以从子类访问它。将其更改为以下任何一项都可行。可能,Node
是最佳选择。
protected
注意第三个选项仅适用于子类与超类在同一个包中的情况。
答案 1 :(得分:2)
当您创建嵌套类private
时,这意味着该类是主类的实现细节的一部分。也就是说,你的主类有它需要提供的公共方法,为了提供这些方法,程序员决定定义另一个类来帮助实现(例如,保存某种数据表,公共方法使用)。 (有时这意味着课程变得过于庞大和复杂,并且有些重构是有序的。但这是另一个问题。)
在任何情况下,如果您希望使用BinaryTree<T>
的课程能够使用Node<T>
,则表明Node<T>
是目的的重要部分BinaryTree类(对于客户端来说),而不仅仅是实现细节。这意味着它可能不应该是private
。