Java类型和名称

时间:2016-04-06 13:41:16

标签: java

我在编程语言课程中有一个homework assignment。这个特殊的练习是关于名字,名字,隐藏,重载和多态重载。

我得到了一个令人困惑但有效的Java程序(如下所示),我需要做的是在程序中每次出现Oompa_Loompa,对其词法角色进行分类(变量名,类名,方法名)等)。 我特别遇到这些问题:

  • 标有/*A*/
  • 的行中的内容 标记为Oompa_Loompa 的行中{li} new附近的/*D*/ 标记为Oompa_Loompa 的行中{li} super附近的/*B*/
  • Oompa_Loompa靠近标有?
  • 的行中的三元/*C*/附近

以下是代码:

class Oompa_Loompa {
  Oompa_Loompa Oompa_Loompa; /*A*/
  <Oompa_Loompa> Oompa_Loompa() {}
  Oompa_Loompa(final Oompa_Loompa... Oompa_Loompa) {
    this(Oompa_Loompa, Oompa_Loompa);
  }
  Oompa_Loompa(final Oompa_Loompa[]... Oompa_Loompa) {
    this();
  }
  Oompa_Loompa Oompa_Loompa(final Oompa_Loompa Oompa_Loompa) {
    Oompa_Loompa: for (;;)
    for (;;)
           if (new Oompa_Loompa(Oompa_Loompa) { /*D*/
                @Override Oompa_Loompa Oompa_Loompa(final Oompa_Loompa Oompa_Loompa) {
                         return Oompa_Loompa != null ? /*C*/
                              super.Oompa_Loompa(Oompa_Loompa) /*B*/
                                :  Oompa_Loompa.this.Oompa_Loompa(Oompa_Loompa);
               }
            }.Oompa_Loompa(Oompa_Loompa) != null)
                break Oompa_Loompa;
             else
               continue Oompa_Loompa;
    return Oompa_Loompa;
  }
}

1 个答案:

答案 0 :(得分:2)

这:super.Oompa_Loompa(Oompa_Loompa)是一种间接递归的方法调用。

您将覆盖Oompa_Loompa方法获得的Oompa_Loompa类型的Oompa_Loompa变量作为参数传递给封闭的Oompa_Loompa方法。

这是一个更健全的版本:

class Klass {

    Klass field;

    <Type_Parameter> Klass() { }

    Klass(final Klass... param) {
        this(param, param);
    }

    Klass(final Klass[]... param) {
        this();
    }

    Klass method(final Klass param) {  // <------------------------\
        outer_loop:                                         //     |
        for (;;) {                                          //     |
            for (;;) {                                      //     |
                if (new Klass(param) {                      //     |
                    @Override                               //     |
                    Klass method(final Klass inner_param) { //     |
                        return inner_param != null          //     |
                             ? super.method(inner_param) // -------/
                             : Klass.this.method(inner_param);
                    }
                }.method(param) != null)
                    break outer_loop;
                else
                    continue outer_loop;
            }
        }
        return param;
    }
}