2011-11-15 35 views
3

如果抽象類不能被實例化,那麼如何才能變量抽象類A的,即使沒有 訪問和方法訪問延伸在類檢查實現(你可以在下面的 代碼中看到)這是一個抽象類的實例嗎?

創建的抽象類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); 
     } 
    } 

輸出

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() {};
右側有是從A.
一個類繼承沒有抽象方法,以便在新的anonimus類,你不需要重寫任何方法的新anonimus類。

5

您要創建一個子類與此代碼 -

A s = new A() {}; 

,並在這裏,以及 -

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

然而,對於實例正常語法是這樣的 -

A a = new A(); 

如果您嘗試運行此代碼,這會導致編譯錯誤。因此,您的班級中沒有任何抽象方法,因此名義子類就足夠了,並且您可以執行代碼。

HTH, - 馬尼什

0
  • 您創建抽象類A 沒有任何抽象方法。
  • 抽象類不能被實例化,但它們可以是子類
  • 抽象方法是一種方法,被宣佈爲沒有執行
  • 在構造函數check()中,您剛剛創建了匿名類並調用構造方法A(String value)。
0
new A("TWO"){}; 

這是一個匿名的子類。
1.本課程同時創建並實例化...
2.沒有那個類的名字..
3.因爲沒有名字,所以它一定需要一個父類。
您可以通過s.getClass().getName();得到名稱,其返回A$1 ....

相關問題