【问题标题】:Can I Instantiate an object of an Interface by the constructor of a class我可以通过类的构造函数实例化接口的对象吗
【发布时间】:2014-05-12 06:18:21
【问题描述】:

我有这样的程序代码。

我的界面是

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

        }
}

【问题讨论】:

  • 你能说得清楚点吗?
  • 我不确定你对那个代码有什么困惑...
  • @Gliptal 我在问一个对象是如何被类构造函数实例化的。但后来我得到了我的答案,它是通过实例化类来分配的。
  • @OliCharlesworth 以上是对您评论的回复。

标签: java interface constructor instantiation


【解决方案1】:

在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 ob1 = new World();。跨度>
  • 是的,界面仅用于此目的。它提供了一个创建类的模板,它不能被实例化。接口旨在由其他类实现。由于许多不同的类可能以不同的方式实现接口并添加自己的方法 MyInterface ob1 = new World() 限制 ob1 对象调用定义在世界类中但在接口中声明的方法。 LHS 只是创建了一个引用类型变量,它知道如何在实例化的世界类对象上指向和调用接口方法(以及它自己的方法)。
【解决方案2】:

事情是接口不能被直接实例化,无论它是由它实现的类来完成的。您的代码完美地实例化并分配给接口。

【讨论】:

  • 所以你的意思是我正在实例化一个类,然后将它分配给一个接口类型变量?但是这样做不会将类类型 Dog 的内存分配给作为 Animal 类型对象的 baby2 吗?
【解决方案3】:

实际上,您正在实例化“世界类”的对象(使用默认构造函数)并使用“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 

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      MyInterface ob1 = new MyInterface(); 
      

      不是。当然

      World obj2 = new World();
      

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

      【讨论】:

        【解决方案6】:

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

        所以我们永远无法创建接口对象。

        但我们可以使用接口变量来保存它的子对象。

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

        左边的ob1是引用变量,不是Object,是interface的引用变量。

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

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

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

        右侧我们调用 new World() 表示 World 类默认构造函数。

        注意:当类中没有定义构造函数时,默认情况下不会定义 arg 构造函数。如果已经定义了任何其他 constrcuotr,则它不会定义默认的 no arg constrctor。

        所以在您的情况下,它使用默认的 no arg constrcutor 并创建一个 World 对象而不是接口。并将其分配给接口变量。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-28
          • 2015-01-24
          • 1970-01-01
          相关资源
          最近更新 更多