考虑以下代码:
long val = 0;
for(int i = 0; i < 2; val++)
val =+ ++i;
System.out.println(val);
Run Code Online (Sandbox Code Playgroud)
为什么val = 3到底?
我会像这样计算:
val i
0 0 i < 2 = true;
0 0 ++i;
0 1 val =+ 1;
1 1 (end of for loop) val++;
2 1 i < 2 = true;
2 1 ++i;
2 2 val =+ 2;
4 2 (end of for loop) val++;
5 2 i < 2 = false;
Output: 5
Run Code Online (Sandbox Code Playgroud)
但它是3.我不明白为什么增量val …
我的应用层/视图有一个事件调度系统,即黑板.在其中,侦听器由散列映射存储,其中键是作为枚举EventType实现的事件类型,而值是侦听此事件类型的侦听器引用.例如,模型对象正在侦听事件类型"LOCAL_PLAYER_INPUT",黑板进程并通知玩家,因为玩家实现了EventHandler接口.
我想通过为模型实现一个独立的黑板来进一步解耦我的模型.然后它将被添加为应用程序层黑板的监听器,因为应用程序层从键盘或触摸获得I/O. 模型黑板本身会进一步委托事件.为此我想创建一个枚举层次结构,其中事件以这种方式分类:
MODEL.LOCAL.PLAYER_INPUT
Run Code Online (Sandbox Code Playgroud)
只有通过这样传递MODEL,模型才会在视图黑板中注册为监听器:
addListener(model.blackboard, MODEL); //Types: (EventHandler, EventType)
Run Code Online (Sandbox Code Playgroud)
通过将接口与我实现的枚举相结合,我可以编写类似MODEL.XY的事件类型,但是尽管MODEL正在实现EventType接口,但addListener不会接受它.
我该怎么办?
编辑:更多代码
addListener方法:
public void addListener(EventHandler handler, EventType eventType) {
getListener(eventType).add(handler);}
private Array<EventHandler> getListener(EventType eventType) {
if(map.containsKey(eventType))
return map.get(eventType);
else {
Array<EventHandler> tmp = new Array<EventHandler>(false, 1, EventHandler.class);
map.put(eventType, tmp);
return tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
枚举:
public interface WL extends EventType {
public static enum LOCAL {
PLAYER_INPUT,
NPC_INPUT
}
Run Code Online (Sandbox Code Playgroud)
}
GameEvent:
public GameEvent(EventType eventType, Object message) {
this.eventType = eventType;
this.message = message;
timeStamp = System.currentTimeMillis();
}
Run Code Online (Sandbox Code Playgroud) 如果这个问题可能一直被问到,我很抱歉,但我搜索过,找不到足够的答案.
如果私有成员/字段被公共成员/方法访问,如何禁用它们的继承?
所以考虑一下:
public class A {
private MemberA a = new MemberA();
public void foo(TypeA x) {
a.methodCall(); //access to a
}
}
public class B extends A {
private MemberB b = new MemberB();
public void foo(TypeB x) {
b.methodCall();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你点击调试器,你会看到,B有一个类型为MemberA的字段.这符合Java规则,因为如果公共成员可以访问私有成员,那么它将被继承.但是在B中,"a"是无用的,只是占用内存 - 即使你没有在B的构造函数中实例化它,因为B调用它的超级构造函数并且它必须在A中实例化,因为它非常适用于a.
我需要为A和B设置相同的方法名称,并且它们必须是公共的,但由于它们从根本上做了不同的事情但是共享共同的逻辑B需要从A继承.
所以基本上,我需要知道如何重载和重写方法同时.或重复代码.该怎么办?