Java中的方法调用语法
我是Java新手。我有2个问题。
问题1:当objDummy尝试通过构造函数调用创建时,
为什么没有分号?
怎么能有一个额外的调用init()?Java中的方法调用语法
问题2:为什么在注释行“constructor ends”处有分号?
它是Java语法的一部分吗?
public abstract class A {
private static final A createDummy() {
// what is the meaning of the following syntax? Qn. 1
if (objDummy == null) {
objDummy = new A (null, null, null){
final void init(String a, String b, Object[][] cArray) {
}
public final boolean isSend() {
return false;
}
// Question 2: format
}; //constructor ends
}//if ends
return objDummy;
} // function createDummy ends
}//class ends
你看到的是一个匿名的内部类声明。
init()
方法没有被调用,它被覆盖。
这就像写:
class Foo extends A {
/* some constructor declaration goes here */
final void init(String a, String b, Object[][] cArray) {}
public final boolean isSend() { return false; }
}
然后
objDummy = new Foo(null, null, null);
这只是压缩成一个单一的表达中,你都定义的A
一个子类,并创建实例。至于为什么语法是这样的,我想答案很简单,就是这样设计的。当你思考表达的含义时,这也是有道理的。
问题1:当试图通过构造函数调用创建objDummy时, 为什么没有分号?
有,这是你问的问题2.
你有什么有一个anonymous class(从new A(null, null, null) {
位通过对您参阅问题2 };
)之一。这就是创建一个类,调用它的构造函数,然后返回分配给objDummy
的结果实例。
怎么能有一个额外的调用init()?
init
不被叫那里,它在匿名类被定义。起初语法可能有点混乱,但一旦你意识到它定义了一个类,它就变得更清晰了。
这可能会是大致再这样写的:
public abstract class A {
private static final A createDummy() {
if (objDummy == null) {
objDummy = new ASubclass(null, null, null);
}
return objDummy;
}
private static class ASubclass extends A {
final void init(String a, String b, Object[][] cArray) {
}
public final boolean isSend() {
return false;
}
}
}
再次声明,这不完全一样(它不会编译,但也与原来的代码;有缺少的构造函数,缺少objDummy
声明),但希望它能澄清一点。详情请参阅链接。下面是一个猜测,在构造函数和一个版本,使得将编译:
public abstract class A {
private static A objDummy;
A(String a, String b, Object[][] cArray) {
}
private static final A createDummy() {
if (objDummy == null) {
objDummy = new ASubclass(null, null, null);
}
return objDummy;
}
private static class ASubclass extends A {
ASubclass(String a, String b, Object[][] cArray) {
super(a, b, cArray);
}
final void init(String a, String b, Object[][] cArray) {
}
public final boolean isSend() {
return false;
}
}
}
您的代码定义扩展A.这是相同的匿名内部类:
public abstract class A {
private static final A createDummy() {
// what is the meaning of the following syntax? Qn. 1
if (objDummy == null) {
objDummy = new B (null, null, null); //constructor ends
}//if ends
return objDummy;
} // function createDummy ends
}//class ends
public class B extends A{
final void init(String a, String b, Object[][] cArray) {
}
public final boolean isSend() {
return false;
}
}
但与仅例外是你的匿名内部类没有类名,并且它也隐含了对其包含类的引用。您可以通过调用“A.this”来使用该参考。
如果你看看我要发布的代码,它会变得更清楚为什么你需要冒号:你基本上声明你的匿名内部类在B的构造函数的最后一个括号和它后面的分号之间。
我冒昧地重新格式化问题中的源代码,使结构更加明显(我只调整了空格,没有其他更改)。 – 2011-04-14 10:07:24
@Joachim:谢谢,我对格式不正确表示歉意!感谢所有成员提供的答案! – Raiden 2011-04-15 07:51:59