2015-04-14 55 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(); 
相關問題