Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaAPI显示了一个实例化接口的示例_Java_Interface_Anonymous Function_Anonymous Class - Fatal编程技术网

JavaAPI显示了一个实例化接口的示例

JavaAPI显示了一个实例化接口的示例,java,interface,anonymous-function,anonymous-class,Java,Interface,Anonymous Function,Anonymous Class,我知道Java接口不能被实例化。但是我在查看JavaAPI中的匿名类解释时发现了一个示例,其中包括创建接口的对象。这怎么可能? 守则的一部分: public class HelloWorldAnonymousClasses { interface HelloWorld { public void greet(); public void greetSomeone(String someone); } public void sayHello() { class EnglishGr

我知道Java接口不能被实例化。但是我在查看JavaAPI中的匿名类解释时发现了一个示例,其中包括创建接口的对象。这怎么可能? 守则的一部分:

public class HelloWorldAnonymousClasses {

interface HelloWorld {
 public void greet();
 public void greetSomeone(String someone); 
 }

 public void sayHello() {

class EnglishGreeting implements HelloWorld {

}

HelloWorld englishGreeting = new EnglishGreeting(); //object 1

HelloWorld frenchGreeting = new HelloWorld() {

String name = "tout le monde"; public void greet() { greetSomeone("mundo");} 
public void greetSomeone(String someone) {
name = someone; System.out.println("Hola, " + name);} }};
Object
englishGreeting
很好,因为对象类型是interface
HelloWorld
,但引用指向Object type
englishGreeting

  • 现在的问题是关于对象
    法语问候语
    。既然它创建了
    HelloWorld
    对象,并且
    HelloWorld
    是一个接口,那么这怎么可能有效呢。如何实例化接口类型。我找不到支持此示例的解决方案。我们可以实例化内部接口吗
  • 链接:

它不是创建接口的实例,而是创建实现HelloWorld
接口的
匿名类的实例

如果您使用javac编译代码,您将看到编译器将为
匿名类
生成类文件,如下所示

 HelloWorld$1.class

现在,如果您使用
javap
反编译生成的类文件,您将看到它实现了HelloWorld

这是绝对允许的。
通过执行
newhelloworld{/*abstracted methods here*/}
您不是在创建接口的实例,而是在实现接口本身的匿名类。 通过创建实现接口的单独类,可以实现相同的结果,例如:

public class HelloWorldImplementation implements HelloWorld {
    /*abstracted methods here*/
}

也许这个例子对你有帮助

public interface IFoo
{

}

IFoo foo = new IFoo {

};

foo
指的是IFoo类型的空对象的内存。

法语问候语
指的是匿名类型的对象。您可以在
bin
文件夹(带有编译类)中看到这些类型。这是一个匿名内部类,因此它实际上是一个类而不是一个接口。与Java中的形式相同,接口无法实例化。您可以添加一点解释吗..可能发布一个答案会有用吗?…因为我在网上找不到与此相关的任何内容。
new Helloworld()
为HellowWorld对象分配内存..对吗?你能补充一点详细的解释吗?.因为我在网上的任何地方都找不到它。@MathewsMathai new HellowWorld()只是一个普通对象,它分配内存。关于它没有什么特别的考虑
HelloWorld
作为一个常规类…在这种情况下
new HelloWorld()
意味着为HelloWorld()类型的对象分配内存,对吗???@MathewsMathai抱歉,但我不明白你的意思?这是不是意味着…这是匿名类实现接口的固定语法?如果
HelloWorld
是一个常规类,那么这种语法是否意味着匿名类是
扩展
HelloWorld?@MathewsMathai你可以这样想。当我开始学习时,我一直在想,新的匿名类实现了一些接口。
@MathewsMathai匿名类实现了HelloWorld接口。@MathewsMathai类和接口的原理不一样。如果实例化一个常规类,则不涉及匿名类。另一方面,如果实例化一个抽象类(例如),则会有一个匿名类,因为其中涉及抽象。