簡體   English   中英

我可以通過類的構造函數實例化接口的對象嗎

[英]Can I Instantiate an object of an Interface by the constructor of a class

我有這樣的程序代碼。

我的界面是

public interface MyInterface {
        public void m1(String name);
        public void m2(int num);
}

我有一個實現上述接口的類。

    public class World implements MyInterface {
        public void m1(String name) {
               System.out.println(name);
        }

        public void m2(int num){
              System.out.println("Number is: "+num);
        }

        public static void main(String args[]) {
                MyInterface ob1  = new World(); //How it is instantiated
                MyInterface ob2  = new World();   //How this one too is instantiated
                ob1.m1("Jaguar"); 
                ob2.m2(5);

        }
}

在Java中,當我們寫一些東西為

Class1 a= new Class2();

到底發生了什么,我們正在調用class2的構造函數,這意味着我們正在class2的堆上創建一個對象,並將其分配給class1類型的引用變量(即a)。 將左邊的部分視為遙控器,將右邊的部分視為電視。 左側部分僅控制可以在右側部分中創建的對象上調用的功能(因為實現類中的功能可能比接口中聲明的功能更多)。

如果我們這樣寫:

Class1 a= new Class1();

引用變量和對象變量都是Class1類型的,因此可以調用Class1的所有方法。

如果我們這樣寫:

Class1 a= new Class2();

將調用Class2的所有方法,但僅限於在Class1中聲明的方法。

因此,您的接口永遠不會被實例化,並且不能進行實例化,它只是對創建的對象(ob1和ob2)提供一種限制,以便僅在對象上調用兩個方法m1和m2即可,無論世界中增加了多少個功能類。

無論接口是否由其實現的類完成,都無法直接實例化。 您的代碼完美地實例化並分配給接口。

實際上,您是在實例化“類世界”的對象(使用默認構造函數),並使用“ MyInterface”的引用對其進行引用。可以稱為Upcasting,下面的鏈接將有助於理解。

http://www.coderanch.com/t/513479/java-programmer-SCJP/certification/Upcasting-Class-interface

   MyInterface ob1  = new World(); //How it is instantiated

這是完全有效的。 但是無法實例化接口,例如,

   INVALID XXXX---> MyInterface obj = new MyInterface(); <----XXXX INVALID 

是的,當沒有顯式聲明其他構造函數時,有一個隱式的無參數構造函數會添加到類中。

從技術上講,您不能實例化接口的任何對象,因為它是抽象類。 但是您可以實例化實現它的任何具體類。 因此,正如Abimaran Kugathasan編寫的MyInterface ob1 = new World(); 有效,但

MyInterface ob1 = new MyInterface(); 

不是。 當然

World obj2 = new World();

也是有效的,但使用了一個較窄的變量(包含World類或其任何子類的對象)

首先要注意的是-接口永遠不會在其中定義構造函數或任何方法。

因此我們永遠無法創建接口的對象。

但是我們可以使用varibale接口保存其子對象。

 MyInterface ob1  = new World(); //How it is instantiated

左側的ob1是參考變量,而不是Object,它是接口的參考變量。

在java中,upcasting(將子對象分配給父對象的參考變量)是合法的並且被允許

所以上面的代碼工作正常。

現在將看到其實例化。

右側,我們調用new World()表示World類默認構造函數。

注意:如果在類中沒有定義構造函數,則默認情況下不會定義arg構造函數。 如果定義了其他任何構造函數,則不會定義默認的無參數構造函數。

因此,在您的情況下,它使用默認的no arg構造函數並創建World not interface的對象。 並將其分配給接口變量。

因此,您的問題的答案是“ Nooooooooooooo”。

暫無
暫無

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

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