在同一个包中有两个类是合法的,其中一个类是另一个类的子类,其中子类是公共的,而超类是包私有的吗?
例如:
package test;
class SuperClass {
public void f(){}
}
package test;
public class SubClass extends SuperClass {
}
我的测试显示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
答案 0 :(得分:2)
是
没有
我经常看不到它,但你可以在JVM中找到它几次(但我现在不记得了,我已经看到了这个)
我不知道我曾见过这种技巧的建议或沮丧。
关于你为什么要这样做。您可能希望创建一个包含共享大量代码的公共类的库。因此,您创建了一个包含此代码的抽象类,您不希望这些代码公开,以确保您可以对此类进行更改而不会破坏代码"在那里"。 protected
无法阻止,因此您可以使抽象类包可见。它会强制您将所有子类放入同一个包中,但这通常不是一个真正的问题。