2015-04-14 47 views
0

我有下面的代码有问题:如何在另一个类中调用抽象的内部类方法?

public class ClassOut { 

    abstract class ClassIn{ 

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

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

我与主要方法另一个类,我想从抽象内部类“abstract class ClassIn”打印变量的值。

也许它适用于匿名类?

+0

为什么抽象类有一个值字段以及一个抽象的getter? – Thomas

+0

您可以创建[匿名内部类](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)或扩展抽象类。 –

回答

3

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

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(); 
    } 
} 
3

您无法在抽象类上调用方法。你必须有一个具体的类派生自这个,它的一个实例,然后调用它。例如

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

我注意到您的评论re。匿名课程。它将与匿名类一起工作,就像上面一样,除了你没有具体类的名字(因此匿名),所以你不能在多个地方使用该派生。

+0

在这里开发@ Brian的好答案..你可以(如果可以的话)使所有东西都静态(!)并称之为(也是抽象的)。 – xerx593

1

要使用一个内部类的成员变量,你必须初始化它

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

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

0
ClassOut co = new ClassOut(); 
co.new ClassIn() { 
    @Override 
    public abstract double getValue() { 
     return 42; 
    } 
}.print(); 

new代替co.new就足够了,当ClassIn将staticvalue可能更好的是protected可以在子类中访问。

0
- 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(); 
相关问题