[英]How to instantiate a class that has a constructor requiring an interface object
[英]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.