Java中的方法调用语法

时间:2011-04-14 09:55:33

标签: java

我是Java新手。我有两个问题 问题1:当尝试通过构造函数调用创建objDummy时,
为什么没有分号? 怎么可以额外调用init()?

问题2:为什么注释行“构造函数结束”会出现分号? 它是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

3 个答案:

答案 0 :(得分:3)

  

问题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;
        }
    }
}

答案 1 :(得分:2)

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

不会调用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的子类又实例化它。至于为什么语法是这样的,我认为答案很简单就是它是这样设计的。当你想到表达的含义时,这也是有道理的。

答案 2 :(得分:1)

您的代码定义了一个扩展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的构造函数的最后一个括号和它后面的分号之间声明你的匿名内部类。 / p>