【问题标题】:How to call abstract Inner class methods, in another class?如何在另一个类中调用抽象内部类方法?
【发布时间】:2015-04-14 11:47:36
【问题描述】:

我对以下代码有疑问:

public class ClassOut {

    abstract class ClassIn{

        public void print() {
            System.out.println("Value: " + getValue());
        }

        double value = 20.5;
        public abstract double getValue();
    }
}

我有另一个带有 main 方法的类,我想打印抽象内部类“abstract class ClassIn”中的值变量。

也许它适用于匿名类?

【问题讨论】:

  • 为什么抽象类既有值域又有抽象getter?
  • 你可以创建Anonymous inner class或者扩展抽象类。

标签: java class abstract


【解决方案1】:

是的,它也适用于匿名类。

public class Main  {

    public static void main(String[] args){
        ClassOut out = new ClassOut();
        ClassOut.ClassIn ob = out.new ClassIn() {

            @Override
            public double getValue() {
                return super.value;
            }
        };

        ob.print();
    }
}

class ClassOut{
    abstract class ClassIn{

        public void print() {

            System.out.println("Value: " + getValue());
        }

        double value = 20.5;
        public abstract double getValue();
    }
}

【讨论】:

    【解决方案2】:

    你不能调用抽象类的方法。你必须有一个派生自 this 的 concrete 类,它的一个实例,然后调用它。例如

    class ConcreteClassIn extends ClassIn {
       public double getValue() {
          return 0.0;
       }
    }
    ConcreteClassIn cc = new ConcreteClassIn ();
    cc.getValue();
    

    我注意到您的评论。匿名类。它可以与匿名类一起使用,就像上面一样,只是你没有具体类的名称(因此 anonymous),因此你不能在多个地方使用该派生。

    【讨论】:

    • 在这里开发的好答案@Brian ..you@AM3 可以(如果可以的话)将所有内容都设为静态(!)并调用它(也在抽象上)。
    【解决方案3】:

    要使用内部类成员变量,您必须实例化它

    Outer.Inner oi = o.new Inner();
    oi.member = 10;
    

    因为你不能实例化一个抽象类,你必须创建一个具体的类来使用它的成员。

    【讨论】:

      【解决方案4】:
      ClassOut co = new ClassOut();
      co.new ClassIn() {
          @Override
          public abstract double getValue() {
              return 42;
          }
      }.print();
      

      当 ClassIn 为 static 时,new 而不是 co.new 就足够了。 value 最好是 protected 以便在子类中访问。

      【讨论】:

        【解决方案5】:
        - You can not call a method on an abstract class. 
        - You have to have create concrete class deriving from this class.
        - Create instance of that derived class and then call method. 
        
        e.g.
        
        class ConcreteClass extends InnerClass 
        {
           public double getValue() {
              return 0.0;
           }
        }
        
        ConcreteClass cc = new ConcreteClass ();
        cc.getValue();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-29
          • 2015-06-16
          相关资源
          最近更新 更多