2016-03-29 3 views
3

このクラスでは、抽象クラスオブジェクトはgetNum()をオーバーライドすることによってインスタンス化されますが、目的は何ですか?Q:抽象クラスオブジェクト開始コード?

public abstract class AbstractTest { 
public int getNum() { 
    return 45; 
} 
public static void main(String[] args) // main function 
    { 
    AbstractTest t = new AbstractTest() // From this point didn't understand 
    { 
    public int getNum() // function 
     { 
     return 22; 
     } 
    }; //use of this   
    System.out.println(t.getNum()); // output 
    } 
} 

答えて

3

あなたmain()方法でインスタンス化は、単に抽象クラスAbstractTestの具体的なインスタンスのインラインクラス定義です。明確にするために、変数tは、匿名の非抽象クラスインスタンスです。次のコードは、同じことを達成するであろう:

public class ConcreteTest extends AbstractTest { 
    @Override 
    public int getNum() { 
     return 22; 
    } 
} 

public static void main (String [] args) { 
    ConcreteTest t = new ConcreteTest(); 
    System.out.println(t.getNum()); 
} 

は、正式なクラス定義を作成する必要が煩雑になる可能性があり、開発の過程での事例があります。たとえば、抽象的なAbstractTestクラスのインスタンスが1つだけ必要な場合は、インライン定義を使用する方が簡単です。

+0

返信いただきありがとうございますが、抽象クラスAbstractTest **の具体的なインスタンスはどういう意味ですか? –

+0

「具体的」とは、抽象クラスではなく、抽象クラスをサンプルコードから拡張したクラスの実際のインスタンスを意味します。 –

+0

:ありがとうございます! –

0

私たちはこのクラスを「匿名クラス」と呼んでいます。クラスを作成して使用する必要がありますが、名前を付けたり再使用する必要がない場合は、匿名クラスを使用できます。 Hereは公式文書です。抽象クラスに使用されるだけでなく、インタフェースや一般的な拡張クラスにも使用できます。

interface Base { 
    void print(); 
} 
public static void main(String[] args) { 

    Base aInterface = new Base() { 
     @Override 
     public void print() { 
      System.out.println("A anonymous implement."); 
     } 
    }; 

    Thread aThread = new Thread() { 
     @Override 
     public void run() { 
      super.run(); 
     } 
    }; 
} 
関連する問題