有没有办法从Java派生类中访问嵌套在超类中的私有内部类?

时间:2014-03-07 19:09:14

标签: java binary-search-tree

也许我没有正确地说出这个问题。以下是我的代码示例:

//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类并使其成为自己的类?

2 个答案:

答案 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