2017-03-08 46 views
2

我開始Java編程,並且遇到了抽象類。我知道你不能創建實例化它們,而不創建具體的類來擴展它們成爲子類。但是,當我嘗試使用這些代碼並且運行正常時,我感到非常困惑。抽象類的「實例化」與其方法體

abstract class Communication{ 
    public void FirstMethod() 
    { 
     System.out.println("I am first method()\n"); 
    } 
} 

public class Main{ 
    public static void main(String[] args){ 
     Communication communication = new Communication() { 
     @Override 
     public void FirstMethod(){ 
      super.FirstMethod(); 
     } 
     }; 

     communication.FisrtMethod(); 
    } 
} 

輸出是:我第一種方法()。 如果我將它修改爲:

Communication communication = new Communication() { 
     @Override 
     public void FirstMethod(){ 
      System.out.println("I've been called from Main"); 
     } 
     }; 

輸出是:我已經從主要調用。 有人可以請解釋一下,如果這是一種實例或這是什麼概念?

+2

這就是所謂的匿名內部類。 – ntalbs

+0

as ntalbs說,這是'匿名內部類'它是某種技術?!你可以在你想創建一個類的實例時使用它,並且重寫它的一些方法,而不用實際創建一個擴展第一個類的新子類。主要用在聽衆... – Yazan

+0

作爲一個側面說明,我想他們應該少用了,現在有[功能接口](https://docs.oracle.com/javase/8/docs/api/java/util /function/package-summary.html) – Aaron

回答

4

這被稱爲

匿名類

定義: 沒有一個類名稱聲明的內部類已知爲匿名內部類。

在匿名內部類的情況下,我們同時聲明和實例化它們。通常,只要您需要重寫類或接口的方法,就會使用它們。

1

這叫做匿名內部類。這樣你就可以實現一個接口或者抽象類,而不必爲它找到一個名字並且同時實例化它。當您僅使用一次某個實現時,這個概念很有用。

的構建物看起來總是這樣:

new SomeClass() { 
    //implementation of methods 
}; 
0

這就是所謂的匿名類。匿名類定義允許您在代碼中提供類定義,並且它沒有正式名稱。匿名類表達式具有類定義和實例創建表達式。這不僅限於抽象類,還可以用於接口和具體類。 例如

abstract class A { } 
// so the anonymous class expression is 

A a = new A() {// class definition }; 

// This will actually create an instance of a 
// class that extends the abstract class A 
// that java will create at run time 

可以即使在這個方法arguments.Example使用匿名類表達在Collections.sort()方法的比較器;

Collections.sort(listOfValues,new Comparator<Value>(){ 
     public int compare(Value v1, Value v2){ 
     // method implemetation. 
     } 
    })