2015-05-25 33 views
1

好吧,人們可能會試圖將其標記爲重複,只需閱讀標題並且不需要真正閱讀問題即可。所以請知道我已經試圖在這個平臺上看看其他問題,但還沒有找到能夠完全解決我的疑問的東西。請讓我伸出手,問我的問題。提前致謝。Java:通過主要方法抽象類調用

接口是絕對抽象的,不能被實例化;一個Java抽象類也不能被實例化,但是如果main()存在,可以被調用。

我不完全理解聲明的後半部分。這是否談論直接在抽象類本身內的主要方法?它是指通過孩子的主要方法調用抽象類嗎?或兩者 ?

其次,我見過類似以下的例子。

abstract class Printer 
{ 
    public void print() { … }; 
} 

public class TestPrinter 
{ 
    public static void main(String[] args) 
    { 
      // use of anonymous class 
      final Printer p = new Printer() 
      { 
       @override 
       public void print() 
       { 
        ... 
       } 
      } 
    } 
} 

而且有人告訴我們,一個匿名班正在工作。但是,我真的不明白,因爲變量'p'顯然被分配給......並且它是一個抽象類變量!這怎麼可能呢?我認爲抽象類不能被實例化或初始化。

任何幫助,將不勝感激。

+0

'final Printer p = new Printer()'這一行指的是一個新類,它是抽象類的一個子類,最重要的是覆蓋了print()方法。 –

+0

@AhhishekVasisht謝謝你的答案。其實,我知道的很多。我知道「新課堂」是每個人都在談論的匿名課程。但是,如何將匿名類分配給「最終打印機p」呢?打印機不是抽象的嗎?如果是這樣,沒有人說抽象類不能被實例化嗎? – Grateful

+0

你的問題的答案在這裏:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.1即,「被實例化的類是匿名的子類「。 –

回答

2
final Printer p = new Printer() 
     { 
      @override 
      public void print() 
      { 
       ... 
      } 
     } 

這意味着一個匿名類被創建,其extends Printer和可變p指的子類的實例。

這只是多態性在行動。通過這裏創建匿名類,你創建的Printer子類中使用多態您使用的是超類引用變量p指子這是匿名的,而是延伸,因爲下面

Printer p = new Printer(){...} 

語法的打印機的對象這不僅限於抽象類,您還可以創建一個實現和接口的匿名類。考慮下面的例子。

package com.test; 

public interface SomeInterface { 

    public void SomeMethod(); 

} 

and a class below package com.test;

public class TestAnonymous { 

    public static void main(String[] args) { 

     SomeInterface obj = new SomeInterface() { 

      @Override 
      public void SomeMethod() { 

       System.out 
         .println("Yaayy!!! Creating an anonymous class which implements SomeInterface "); 

      } 
     }; 

     obj.SomeMethod(); 

    } 

} 

打印出

Yaayy!創建它實現SomeInterface

什麼是指語法創建匿名類其或者擴展抽象類或實現其參考變量用於實例化所述接口匿名類。它調用子類的方法。

您可以參考jsl。https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.1

現在你的問題

接口絕對是抽象的,不能被實例化;一個Java抽象類也不能被實例化,但可以援引一個main()存在

我從你的問題理解的是你是否想知道是否主要方法可以在抽象類沒有實例它運行,答案是YES

package com.test; 

public abstract class AbstractClass { 

    public static void main(String[] args) { 

     System.out.println("main method in abstract class"); 

    } 

} 

編譯和使用java AbstractClass調用它,它應該打印

main method in abstract class 

,如果你想知道抽象類的構造函數是否INVO在實例化任意類時或者沒有時,那麼答案也是YES。 當調用子類構造函數時,它通過調用super()調用超類構造函數。所以抽象類的構造函數也會被調用。 http://www.thejavageek.com/2013/07/21/initialization-blocks-constructors-and-their-order-of-execution/

+0

謝謝,它很全面。但是,我的下一個問題是......如果你可以對抽象和接口都做到這一點,那麼爲什麼原始語句單獨抽象類呢?我認爲它是在討論如何BOTH接口和抽象類不能實例化,但抽象類CAN有一個內部的主要方法,也可以調用它。這是真的?如果是這樣,你還能夠提供一個這樣的例子嗎?非常感激。 – Grateful

+0

感謝您的幫助Prasad。我已經「選擇」了你的答案,但是你能否給出一個真實世界的例子。我發現很難知道這可能適用於哪裏......因爲,爲什麼我需要在anstract類中使用主要方法? – Grateful

+0

我想現在每個應用程序都會在網絡上,現在應用程序中會使用主要方法。我個人從來沒有創造它。 –

1

abstract類就像任何其他類一樣 - 除了它不能直接實例化的事實。我想你知道這種設施的用途。因此,它可以很好地具有main(),這是一個static方法,而不是一個實例方法

匿名類在你的例子,extend S中的抽象類(或implement S上的接口,如果指定了一個)。所以p沒有分配給一個abstract類的實例,但也不能被實例化擴展抽象類

0

一個Java抽象類的類的實例,但是,如果一個main()存在可以被調用。

由於main()方法是靜態的,可以在沒有實例化的情況下調用。例如

abstract class AbstractClass{ 
    public static void main(String[] args){ 

    } 
} 

同樣是不正確的interface直到Java7,隨着Java8你可以有內部interface因此同一個靜態的主要方法會爲Java8

你的第二個問題是真實的,而創造的Printer一個實例你有定義了Printer的子類,但是不能再次使用此定義的Printer實現(因爲沒有與實現關聯的名稱),因此,它是匿名的。

+0

謝謝Nitin。 – Grateful

0

Java抽象類也不能被實例化,但如果存在main(),則可以調用Java抽象類。

這是無稽之談。任何抽象類的靜態方法都可以被調用。不只是main().

其次,我見過像下面這樣的例子......並且被告知匿名類正在工作。

這是正確的。

但是,我真的不明白怎麼做,因爲變量'p'顯然被分配給......並且它是一個抽象類變量!這怎麼可能呢?我認爲抽象類不能被實例化或初始化。

它是正在這裏實例化的匿名類,它延伸抽象類,並提供了抽象方法的實現。 參考被存儲到Person p,因爲Person是匿名類的超類。你可以爲任何其他類或接口做到這一點。這裏沒有新東西。

+0

謝謝你的EJP。你的解釋是確切的。我希望我可以選擇多個答案,但我不能,我恐怕我不得不「選擇」在你面前以類似方式回答的人。儘管如此。非常感謝。 – Grateful