我可以通过类的构造函数实例化接口的对象

时间:2014-05-12 06:18:22

标签: java interface constructor instantiation

我有这样的程序代码。

我的界面

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);

        }
}

6 个答案:

答案 0 :(得分:4)

在我们写一些东西时的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,无论多少函数被额外添加在世界级。

答案 1 :(得分:1)

Thing is Interface无法直接实例化它是否由其实现的类完成。您的代码完全实例化并分配给接口。

答案 2 :(得分:1)

实际上你在这里实例化'class World'的对象(使用默认构造函数)并使用'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 

答案 3 :(得分:0)

是的,当没有显式声明其他构造函数时,会有一个隐式的无参数构造函数添加到类中。

答案 4 :(得分:0)

从技术上讲,您无法实例化接口的任何对象,因为它是一个抽象类。但是您可以实例化任何实现它的具体类。 正如Abimaran Kugathasan所写 MyInterface ob1 = new World();有效,但

MyInterface ob1 = new MyInterface(); 

不是。当然

World obj2 = new World();

也有效,但使用的是较窄的变量(包含类World或其任何子类的对象)

答案 5 :(得分:0)

首先要注意的是 - 接口永远不会有构造函数或其中定义的任何方法。

所以我们永远不能创建一个接口对象。

但我们可以使用interface varibale来保存其子对象。

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

leftside ob1是一个引用变量而不是一个Object,它是一个接口的引用变量。

在java中,upcasting(将子对象分配给父的引用变量)是合法的并且允许

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

现在将看看它是如何实例化的。

右边我们称新世界()意味着世界级的默认建筑师。

注意:当类中没有定义构造函数时,默认情况下不会定义arg constrcutor。如果任何其他constrcuotr是alrady定义,那么它不会定义默认没有arg constrctor。

所以在你的情况下它使用默认的没有arg constrcutor并创建一个World not interface的对象。并将其分配给接口变量。

所以回答你的问题是“Nooooooooooooo”。