相关疑难解决方法(0)

Java - (匿名子类)在对象实例构造期间重写方法

我正在维护一些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)

代码目前正在编译并正确运行,但我现在需要更新它.

我的问题是:

  1. init()在构造过程中,该方法的覆盖是如何工作的newEntity
  2. 对象构造函数语句中包含此方法覆盖的正确术语是什么?

到目前为止,我的研究表明Java无法动态覆盖方法 - 在此基础上无法覆盖,因为方法覆盖是按类而不是按对象.但是这段代码片段似乎表明Java可以在实践中做到这一点?

java polymorphism inheritance constructor java-8

7
推荐指数
2
解决办法
935
查看次数

Java转义为'this'的引用

我开始阅读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 concurrency

5
推荐指数
1
解决办法
281
查看次数

我的私人成员如何设置为null?

我已经专业编程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中遇到过一些错误吗?除非我错了,否则父类不会干扰私有成员,无论我在我向你展示的代码行之间放置什么,我都不能在不使用标识符"成员"的情况下更改成员的值".

java null private-members

3
推荐指数
1
解决办法
1809
查看次数

在构造函数中为 lambda 的情况下的“this”引用转义

关于这个问题 -

对外部类的“this”引用如何通过发布内部类实例来转义?

如果我们用 lambda 或方法引用替换匿名类,那么这段代码为什么以及如何表现?

public class ThisEscape {
    public ThisEscape(EventSource source) {
         source.registerListener(e -> doSomething(e));
    }
}
Run Code Online (Sandbox Code Playgroud)

java concurrency java-8

3
推荐指数
1
解决办法
104
查看次数

我让'this'参考逃脱了吗?(构造函数实例化中的内部类,没有事件侦听器,没有线程)

我在构造函数中实例化一个内部类,但我不是用它来启动线程或作为事件监听器.例如:

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"吗?

java

2
推荐指数
1
解决办法
246
查看次数