公共班级的超级班级可以私有化吗?

时间:2017-11-22 22:28:05

标签: java

在同一个包中有两个类是合法的,其中一个类是另一个类的子类,其中子类是公共的,而超类是包私有的吗?

例如:

package test;
class SuperClass {
    public void f(){}
}

package test;
public class SubClass extends SuperClass {
}
  1. 合法吗?
  2. 如果是的话,是否有任何技术原因(不是意见)为什么不应该使用它?
  3. 这是广为人知的行为吗?
  4. 这是推荐的吗? (意见)
  5. 我的测试显示JavaDoc为子类呈现文档,就好像超类不存在一样。没有提到超级班。在超类中声明和实现的公共方法显示为在子类中声明它们。

    Java反射API显示类似的行为:在.getDeclaringClass()上调用Method时,在超类中声明和实现的公共方法返回子类。但是,subclass.getSuperclass()确实会返回正确的超类。

    其他课程和输出:

    package test;
    public class InstanceOfChecker {
        public static boolean isInstanceOfSuperClass(Object o){
            return (o instanceof SuperClass);
        }
    }
    
    package otherpackage;
    public class Test {
        public static void main(String[] args) throws Exception {
            System.out.println("f() declaring class: "
                    + SubClass.class.getMethod("f").getDeclaringClass().getName());
            System.out.println("super class: "
                    + SubClass.class.getSuperclass().getName());
            System.out.println("InstanceOfChecker returns: "
                    + InstanceOfChecker.isInstanceOfSuperClass(new SubClass()));
        }
    }
    

    输出:

    f() declaring class: test.SubClass
    super class: test.SuperClass
    InstanceChecker returns: true
    

1 个答案:

答案 0 :(得分:2)

  1. 合法吗?
    1. 如果是的话,是否有任何技术原因(不是意见)为什么不应该使用它?
    2. 没有

      1. 这是广为人知的行为吗?
      2. 我经常看不到它,但你可以在JVM中找到它几次(但我现在不记得了,我已经看到了这个)

        1. 这是推荐的吗? (意见)
        2. 我不知道我曾见过这种技巧的建议或沮丧。

          关于你为什么要这样做。您可能希望创建一个包含共享大量代码的公共类的库。因此,您创建了一个包含此代码的抽象类,您不希望这些代码公开,以确保您可以对此类进行更改而不会破坏代码"在那里"。 protected无法阻止,因此您可以使抽象类包可见。它会强制您将所有子类放入同一个包中,但这通常不是一个真正的问题。