有没有办法从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>{