2011-11-15 6 views
3

抽象クラスはこれは抽象クラスのインスタンス化ですか?

その後、(あなたが コードの下に見ることができるように)抽象クラスAの変数 アクセスやメソッドのアクセスができさえ は延長せずにクラスチェックで達成されるか、インスタンス化できない場合

は抽象クラスAのオブジェクトですか?

CODE

abstract class A 
    { 
     int a=10; 
     public A() 
     { 
      System.out.println("CONSTRUCTOR ONE"); 
     } 
     public A(String value) 
     { 
      System.out.println("CONSTRUCTOR "+value); 
     } 
     void add(int sum) 
     { 
      System.out.println("THE SUM IS:"+sum); 
     } 
     int sub(int a,int b) 
     { 
      return(a-b); 
     } 
    } 

    public class check 
    { 
     public check() 
     { 
      new A("TWO"){}; 
     } 
     public static void main(String args[]) 
     { 
      int a,b,sum; 
      a=10; 
      b=15; 
      sum=a+b; 
      A s = new A() {}; 
      new check(); 
      s.add(sum); 
      int subb=s.sub(35,55); 
      System.out.println("THE SUB IS:"+subb); 
      System.out.println("THE VALUE OF A IS:"+s.a); 
     } 
    } 

OUTPUT

CONSTRUCTOR ONE 
CONSTRUCTOR TWO 
THE SUM IS:25 
THE SUB IS:-20 
THE VALUE OF A IS:10 
BUILD SUCCESSFUL (total time: 0 seconds) 

答えて

7

new A() {}呼び出しは匿名のサブクラスを作成し、そのインスタンスを作成します。 Aには抽象メソッドが含まれていないため、これは機能します。

+1

これは実際にはs.getClass()。getName();を呼び出して確認できます。作成された匿名サブクラスの名前を返します(通常A $ 1のようなものです)。 – linead

1

通常の使用例は、new MyAbstractClass(){と書いて、実装する必要がある抽象メソッドを実装します(および/または既存の非抽象メソッドをオーバーライドします)。そして、コンパイラは非抽象サブクラスを推論します。クラスには抽象メソッドがないため、何も上書きする必要はありません。

1

Aは抽象メソッドがないため、new A() {}を実行すると、何も含まれていない実装が提供され、具体的な実装が提供され、クラスが完成します。

0

"可視性"(パブリック、プライベート、パッケージスコープなど)を無視すると、一般的にクラスメンバーにアクセスするにはクラスインスタンスが必要です。

例外は静的クラスです。

抽象基本クラスを使用している場合は、サブクラス化してインスタンスを取得する必要があります。

しかし、あなたの場合、クラスは本当に "抽象的な"ではありません。単純に抽象メンバやメソッドが存在しないためです。右側に

0

A s = new A() {};
は、あなたがどのメソッドをオーバーライドする必要はありませんあなたの新しいanonimusクラスでそうではない抽象メソッドを持っているA.
クラスから継承された新しいanonimusクラスがあります。ここにも

A s = new A() {}; 

をして - -

5

あなたは、このコードでのサブクラスを作成している

A a = new A(); 

-

public check() 
{ 
    new A("TWO"){}; 
} 

一方、インスタンス化のための通常の構文はこれですこのコードを実行しようとするとコンパイルエラーが発生します。そのため、クラスに抽象メソッドがないため、名目上のサブクラスで十分であり、コードを実行することができます。

HTH、 - マニッシュ

0
  • あなたは、任意の抽象メソッドずに抽象クラスA を作成しました。
  • 抽象クラスはインスタンス化することはできませんが、サブクラスにすることができます。
  • 抽象メソッドは、実装なしでと宣言されたメソッドです。
  • コンストラクタcheck()で匿名クラスを作成し、コンストラクタA(文字列値)を呼び出しました。
0
new A("TWO"){}; 

これは匿名のサブクラスです。
1.このクラスは、同時に作成してインスタンス化します...
2.そのクラスの名前はありません。
3.名前がないので、親が必要です。
名前を取得できるのは、A$1です。

関連する問題