我正在维护一些Java 8代码,如下所示:
Class Entity {
protected Model theModel;
public Entity() {
init();
}
protected void init() {
this.theModel = new Model();
}
}
Class Model {
}
Class SubModel extends Model {
}
main {
Entity newEntity = new Entity() {
@Override
protected void init() {
this.theModel = new SubModel();
}
};
}
Run Code Online (Sandbox Code Playgroud)
代码目前正在编译并正确运行,但我现在需要更新它.
我的问题是:
init()在构造过程中,该方法的覆盖是如何工作的newEntity?到目前为止,我的研究表明Java无法动态覆盖方法 - 在此基础上无法覆盖,因为方法覆盖是按类而不是按对象.但是这段代码片段似乎表明Java可以在实践中做到这一点?
我开始阅读Java Concurrency in Practice,我遇到了以下示例(这是一个反面的例子 - 显示了不好的做法):
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
书中的作者写道:
当ThisEscape发布EventListener时,它也隐式发布封闭的ThisEscape实例,因为内部类实例包含对封闭实例的隐藏引用.
当我考虑使用这样的代码时,我可以这样做:
EventSource eventSource = new EventSource();
ThisEscape thisEscape = new ThisEscape(eventSource);
Run Code Online (Sandbox Code Playgroud)
我可以获得对已注册的EventListener的引用,但是我能获得对封闭的ThisEscape实例的引用是什么意思?
有人能给我一个这样的行为的例子吗?用例是什么?
我已经专业编程java十多年了.这是我试图追踪的最奇怪的错误之一.我有一个私有成员,我初始化它然后它自己变为null.
public class MyObject extends MyParent
{
private SomeOtherClass member = null;
public MyObject()
{
super();
}
public void callbackFromParentInit()
{
member = new SomeOtherClass();
System.out.println("proof member initialized: " + member);
}
public SomeOtherClass getMember()
{
System.out.println("in getMember: " + member);
return member;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
proof member initialized: SomeOtherClass@2a05ad6d
in getMember: null
Run Code Online (Sandbox Code Playgroud)
如果您运行此代码,显然它将正常工作.在我的实际代码中,在这个确切的模式中只有这三种情况(如果计算打印输入,则为五次).
我在JVM中遇到过一些错误吗?除非我错了,否则父类不会干扰私有成员,无论我在我向你展示的代码行之间放置什么,我都不能在不使用标识符"成员"的情况下更改成员的值".
关于这个问题 -
如果我们用 lambda 或方法引用替换匿名类,那么这段代码为什么以及如何表现?
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(e -> doSomething(e));
}
}
Run Code Online (Sandbox Code Playgroud) 我在构造函数中实例化一个内部类,但我不是用它来启动线程或作为事件监听器.例如:
public class Something {
final InnerSomething innerSomething = new InnerSomething();
public Something(Param arg) {
super(arg);
}
private class InnerSomething {...}
...
}
Run Code Online (Sandbox Code Playgroud)
编辑:我复制并粘贴了其他地方的代码,忘了删除"abstract"关键字.
EDIT2:"'this'参考转义"的"我的"定义是Java Concurrency in Practice一书中的一个.
使用上面的代码,我允许'this'引用"escape"吗?