【发布时间】:2015-04-05 11:27:28
【问题描述】:
package pack1;
public class Outer{
private Outer(){}
}
package pack2;
import pack1.*;
public class ExtendedOuter extends Outer{
//compiler adds default no-args constructor, something like this
/*
public ExtendedOuter(){
super(){}
}
*/
}
now from a third class
import pack1.Outer;
import pack2.ExtendedOuter;
class InnerClasses{
public static void main(String[] args){
ExtendedOuter o=new ExtendedOuter();
}
}
但是,嘿,
Outer 的构造函数是私有的,所以你会认为这段代码不能编译,但它编译得很好。
只有在运行时我们才知道当它抛出 IllegalAccessError 时我们搞砸了
但这只是有时会发生!
有时您确实会收到错误 Outer() is private ,有时您不会收到错误
如何解释这种随机行为?
但是在编译时会警告私有方法调用。那么为什么不涉及隐式添加的构造函数呢?
PS:如果您在ExtendedOuter 类中显式添加构造函数ExtendedOuter(){},编译器会抛出错误Outer() is private in Outer class
编辑-----------
我很抱歉,但这没有任何意义。它确实不可预测,并且结果因一个编译而异
惊喜
好的,如果这不起作用,请尝试将外部构造函数的修饰符从 private 切换到 public
好的,现在它可以工作并编译了
现在再次将修饰符切换为private,再次编译!它不应该有,不是吗?但是运行它你会遇到IllegalAccessError
现在一段时间后,它甚至无法编译 private 显示典型消息 Outer() is not public in Outer class
伟大的 。现在将Outer()构造函数的修饰符再次切换为public,编译!现在再次切换到private,编译(而之前它没有编译)
自己尝试一下,然后告诉我 但别忘了用 -cp 编译 javac
【问题讨论】:
-
它无法编译。你不能扩展一个没有可访问构造函数的类。
-
@Sarabjeet,你用的是什么编译器?
-
您可能没有重新编译所有类。当然,如果在Outer有公共构造函数的情况下先编译子类,然后将Outer类改为私有构造函数,只重新编译Outer,子类不会被修改,运行时会抛出异常。确保每次更改后重新编译所有类。
-
好吧,我认为这不是 JB Nizet 的问题,因为我刚刚在
ExtendedOuter中插入了一个新方法并保存了它,但没有编译ExtendedOuter并且当我访问来自 mainclass 的方法,它工作正常。我认为所有链接到主类的类都会自动重新编译 -
@Sarabjeet 请接受您的问题的答案,而不是未完成。我当然不是要你选择我的答案,但它会帮助其他人知道你最终接受的答案。如果尚未发布答案,请自行制作并接受您的答案。
标签: java inheritance constructor