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

有没有办法从Java中的派生类访问嵌套在超类中的私有内部类?,java,binary-search-tree,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 variab

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

//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 }
//通用二叉树类
公共类二叉树{
//内部节点类
私有最终静态类节点{
//代码
}
私有节点根;//此类的实例变量
//方法
//假设根的setter/getter
}
//MyTree类。我扩展它是因为我想使用所有
//方法,然后是其他一些适用的方法
//只有这一类
类MyTree扩展了BinaryTree{
void-aMethod(){
//我希望能够做到这一点,但在尝试访问私有类时会出现错误
节点=根;
}
公共静态void main(字符串[]args){
}
}
类学生实现可比较的{//implemented method here}
在上面的示例中,我希望能够访问MyTree类中的根。我该怎么做?也许有更好的方法来解决这个问题?我认为最好去掉内部节点类并使其成为自己的类

//inner node class
private final static class Node<T>{
   //code
}

public Node<T> root; //instance variable for this class
注意,第三个选项仅适用于子类与超类位于同一个包中的情况


注意,第三个选项仅适用于子类与超级类位于同一个包中的情况。

当您将嵌套类设置为私有类时,这意味着该类是主类的实现细节的一部分。也就是说,主类具有它需要提供的公共方法,为了提供这些方法,程序员决定定义另一个类来帮助实现(例如,保存公共方法使用的某种数据表)。(有时这意味着类变得太大、太复杂,需要进行一些重构。但这是另一个问题。)


在任何情况下,如果您希望使用
BinaryTree
的类能够使用
Node
,这表明
Node
BinaryTree
类的一个重要部分(在客户端看来),而不仅仅是一个实现细节。这意味着当您创建一个嵌套类
private
时,它可能不应该是
private

,这意味着该类是主类的实现细节的一部分。也就是说,主类具有它需要提供的公共方法,为了提供这些方法,程序员决定定义另一个类来帮助实现(例如,保存公共方法使用的某种数据表)。(有时这意味着类变得太大、太复杂,需要进行一些重构。但这是另一个问题。)


在任何情况下,如果您希望使用
BinaryTree
的类能够使用
Node
,这表明
Node
BinaryTree
类的一个重要部分(在客户端看来),而不仅仅是一个实现细节。这意味着它可能不应该是
私有的

为什么不将
节点
设为公共的
?为什么不在
二进制树
类中设置访问器和变异器方法?为什么要将节点类设置为静态的?如果这样做,所有实例化的
BinaryTree
对象只能有一个根节点。这就是你在设计中想要的吗?因为它是嵌套的,所以将其公开是一种糟糕的风格吗?这就是我的原因back@user3270407不,不是。您肯定可以拥有
public
内部类。或者,如果可能,只使用默认访问权限。但是我肯定会将
设置为
私有
字段。为什么不将
节点
设置为公共
?为什么不在
二进制树
类中设置访问器和变异器方法?为什么要将节点类设置为静态的?如果这样做,所有实例化的
BinaryTree
对象只能有一个根节点。这就是你在设计中想要的吗?因为它是嵌套的,所以将其公开是一种糟糕的风格吗?这就是我的原因back@user3270407不,不是。您肯定可以拥有
public
内部类。或者,如果可能,只使用默认访问权限。但是我肯定会将
设置为
私有
字段。这是一个很好的答案。非常感谢。这是一个很好的答案。非常感谢。
public final static class Node<T>{
protected final static class Node<T>{
final static class Node<T>{