繁体   English   中英

公共类的超类可以私有化吗?

[英]Can a public class's super class be package private?

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

例如:

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

package test;
public class SubClass extends SuperClass {
}
  1. 合法吗
  2. 如果是这样,是否有任何技术原因(不是意见)为什么不应该使用它?
  3. 这是广为人知的行为吗?
  4. 推荐这个吗? (意见)

我的测试表明,JavaDoc呈现子类的文档,就好像超类不存在一样。 更不用说超一流了。 在父类中声明和实现的公共方法就像在子类中声明的那样显示。

Java反射API表现出类似的行为:在Method上调用.getDeclaringClass()时,在超类中声明和实现的公共方法返回子类。 但是, 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. 合法吗

  1. 如果是这样,是否有任何技术原因(不是意见)为什么不应该使用它?

没有

  1. 这是广为人知的行为吗?

我很少看到它,但是您可以在JVM中找到它两次(但是我现在不记得了,我在哪里看到过它)

  1. 推荐这个吗? (意见)

我不知道我曾见过对此技术的建议或劝阻。

关于为什么要这样做。 您可能想使用共享许多代码的公共类创建一个库。 因此,您将创建一个包含不想公开的代码的抽象类,以确保可以在不中断代码的情况下对此类进行更改。 protected不能阻止这种情况,因此您可以使抽象类包可见。 它迫使您将所有子类放入同一包中,但这通常不是真正的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM