【问题标题】:inner class access to outer class method, same method names内部类访问外部类方法,方法名相同
【发布时间】:2012-08-27 09:14:04
【问题描述】:

我有一个类和一个内部类

01 public class A{
02   void test(){};
03   public class B{
04     void test(){
05       test();
06     }
07   }
08 }

好的,在第05行id喜欢访问A类的方法test。 但是我进入了一个循环,因为我不知道如何指定使用A类的方法。

有什么想法吗?

【问题讨论】:

  • 那不是子类。如果你真的想要这个结构 A.this.test() 会工作。
  • @Thilo 你说得对,它是一个内部类。抱歉 4

标签: java inner-classes


【解决方案1】:
01 public class A{
02   void test(){};
03   public class B{
04     void test(){
05       test();  // local B.test() method, so recursion, use A.this.test();
06     }
07   }
08 }

编辑:正如@Thilo 提到的:避免在外部类和内部类中使用相同的方法名称,这将避免命名冲突。

【讨论】:

  • +1。一个可能更好的解决方案是将方法名称更改为不冲突。
  • 一般来说,避免使用相同的方法名是正确的,但我的情况是 Freemarker Hibernate Template for generarte delegator-classes only from existing instances.
  • 我已经在我自己的代码上试过这个,我得到'非静态变量,这不能从静态上下文中引用'。当我放弃 A 所以它就变成了 this.test() (我从测试中得到了一些东西)我得到'找不到符号'。是不是因为我有一个导致错误的返回值,如果是这样,那么我如何将一个值从外部函数返回到内部函数
【解决方案2】:

你可以这样做:

public class A{
   void test(){
        System.out.println("Test from A");
    };
    public class B{
        void test(){
            System.out.println("Test from B");
            A.this.test();
        }
    }

    public static void main(String[] args) {
            A a = new A();
            B b = a.new B();
            b.test();
    }
}

然后你有以下输出:

Test from B
Test from A

【讨论】:

    【解决方案3】:

    B类不必是所谓的嵌套类来扩展A类就行了

    public class B extends A {
    ...
    
    }
    

    你可以像调用 A 的 test() 一样

    super.test()
    

    如果你像你那样调用 test(),这就是我们所说的递归,并且会一直冻结到审判日

    【讨论】:

      【解决方案4】:

      如果你把它设为静态,你可以调用

      A.test()
      

      否则你需要一个 A 的实例才能在 B 中使用

      A a;
      a.test();
      

      【讨论】:

        猜你喜欢
        • 2015-09-28
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        相关资源
        最近更新 更多