簡體   English   中英

創建抽象類或匿名類的實例

[英]Creating the instance of abstract class or anonymous class

在這段代碼中,它是創建抽象類或匿名類的對象嗎? 請告訴我。 我在這里有點困惑。

public abstract class AbstractDemo {

    abstract void showMessage();
    abstract int add(int x,int y);

    public int mul(int x,int y){
        return x+y;
    }


    public static void main(String[] args) {
        AbstractDemo ad = new AbstractDemo() {

            @Override
            void showMessage() {
                // TODO Auto-generated method stub

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };

        System.out.println(ad.mul(10, 12));
        System.out.println(ad.getClass());
    }

}

您創建一個擴展抽象類的匿名類。

在下面的剪輯中,您將擴展AbstractDemo並為其抽象方法提供實現。

new AbstractDemo() {
    @Override
    void showMessage() {
        // TODO Auto-generated method stub
    }

    @Override
    int add(int x, int y) {
        // TODO Auto-generated method stub
        return 0;
    }
};

以下是這段簡短而無辜的代碼中發生的事情:

AbstractDemo ad = new AbstractDemo() {

            @Override
            void showMessage() {
                // TODO Auto-generated method stub

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };
  1. 定義了新類 (沒有名稱,所謂的匿名類)
  2. 這個新類擴展了AbstractDemo
  3. 抽象方法AbstractDemo在這個新類中重寫
  4. 創建了此新類的新實例並將其分配給ad變量

這里閱讀有關Java中anonymous classes更多信息。

您無法創建抽象類的實例。
您可以創建擴展抽象類的類的實例。

抽象類的重點是它是抽象的 - 你已經定義了一個接口而不是一個實現 如果沒有實現,實例化類將不會產生有意義或有用的結果。 如果確實/有意義地實例化該類的對象,那么您根本不想首先使用抽象類。

您可以對以下實例使用匿名類概念:

AbstractDemo abstractDemo  = new AbstractDemo() {
            @Override
            void showMessage() {
                // TODO Auto-generated method stub
            }
            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        }; 
@Override // Here
void showMessage() {
    // TODO Auto-generated method stub
}

@Override // here
int add(int x, int y) {
    // TODO Auto-generated method stub
    return 0;
}

首先你要知道你不能為abstract class創建一個instance ,這里你只是創建一個anonymous class ,它就像一個擴展abstract classinner class ,因此它屬於你的anonymous class

您正在重寫 anonymous class abstract methods 。這就是您可以創建對象的原因。 見下文。

        @Override // Here
        void showMessage() {
            // TODO Auto-generated method stub

        }

        @Override // here
        int add(int x, int y) {
            // TODO Auto-generated method stub
            return 0;

Abstract Class實現可以像你一樣實例化。

不能創建獨立的Abstract類的Object,但可以創建一個匿名的抽象類對象,因為它提供了實現。

Java不允許抽象類對象的原因是,因為它沒有任何方法或某些方法的任何實現,所以你怎么能有一個不完整類的對象。 但是在匿名的方式,你給它實現,所以它允許你有一個對象。

接口相同的情況

 AbstractDemo ad = new AbstractDemo() {

            @Override
            void showMessage() {
                // TODO Auto-generated method stub

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };

這里AbstractDemo類是抽象的,但它的實現類可以有對象,這里匿名類代碼實現代碼,因此完全允許有對象。

更多深入研究,請參閱下面的代碼,MyAbstractClass是一個抽象類,現在如果你注釋掉了

abstract void play();

然后它工作正常,Java允許創建這個抽象類的對象但是當你取消注釋時,它會拒絕,因為它沒有關於該方法的任何實現,因此拒絕創建對象。

abstract class MyAbstractClass {
    private String name;

    public MyAbstractClass(String name)
    {
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
    abstract void play();



}


public class Test2 {

    public static void main(String [] args)
    {
        MyAbstractClass ABC = new MyAbstractClass("name") {
        };

        System.out.println(ABC.getName());
    }

}

在構造函數調用之后仔細檢查它是{},這意味着不再需要實現,或者可以覆蓋其方法之一或更多。

在匿名類中實現抽象方法之后,您的AbstractDemo不再是抽象的。 它說的很好:

Class AbstractDemoImpl extends AbstractDemo {

    void showMessage() {
            // TODO Auto-generated method stub
    }
    int add(int x, int y) {
            // TODO Auto-generated method stub
            return 0;
    }
}

這里我們提供抽象類的實現。在我們創建對象的時候,我們提供它的實現並覆蓋所有抽象方法。在Abstract類只有具體方法的情況下。 見下面的例子

abstract class MyAbstractClass {
    private String name;

    public MyAbstractClass(String name)
    {
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
}

public class Test {

    public static void main(String [] args)
    {
        MyAbstractClass ABC = new MyAbstractClass("name") {
        };

        System.out.println(ABC.getName());
    }
}

這里我們只是使用像{}之類的調用構造函數來創建對象。

  1. 我們正在使用匿名類證明實現。

什么只是沒有名字的階級,我們需要做的就是當我們創造一個對象時。

  1. 是的,我們通過在運行時證明實現來制作抽象類的對象。

4.為什么抽象類允許構造函數打開答案? 但我們無法創造它的對象。

5.與抽象類相關的另一個問題是我們在抽象類中只能有靜態塊。這是什么意思?

6.Only靜態塊因為我們只想加載一次而不擴展和創建它的對象。

7.編譯代碼后,我們用來獲取每個具體類,抽象類或接口的.class。

8.下一個問題出現在這里為什么java人不允許在接口中使用靜態塊?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM