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 
+2

我冒昧地重新格式化问题中的源代码,使结构更加明显(我只调整了空格,没有其他更改)。 – 2011-04-14 10:07:24

+0

@Joachim:谢谢,我对格式不正确表示歉意!感谢所有成员提供的答案! – Raiden 2011-04-15 07:51:59

你看到的是一个匿名的内部类声明。

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的构造函数的最后一个括号和它后面的分号之间。