Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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
Java 我可以为接口创建对象吗?_Java_Class_Oop_Instance - Fatal编程技术网

Java 我可以为接口创建对象吗?

Java 我可以为接口创建对象吗?,java,class,oop,instance,Java,Class,Oop,Instance,是否可以为接口创建对象?如果是,如何完成? 根据我的观点,以下代码说明我们可以: Runnable r=newrunnable(){ //一些实现 } 不能直接实例化接口,但可以实例化实现该接口的类: public class RunClass implements Runnable { // Class implementation } Runnable r = new RunClass(); 这基本上与您在内联中所做的相同。new Runnable()后面的括号将包含您的内联实现

是否可以为接口创建对象?如果是,如何完成? 根据我的观点,以下代码说明我们可以:

Runnable r=newrunnable(){
//一些实现
}

不能直接实例化接口,但可以实例化实现该接口的类:

public class RunClass implements Runnable {
    // Class implementation
}

Runnable r = new RunClass();

这基本上与您在内联中所做的相同。new Runnable()后面的括号将包含您的内联实现。

这不是创建接口实例,而是创建一个实现接口的类。所以当你写作时:

Runnable Runnable=new Runnable(){
@凌驾
公开募捐{
//TODO自动生成的方法存根
}
};
实际上,您正在创建一个实现Runnable接口的类。 您需要遵循这里的所有规则,在这里,我们将覆盖
Runnable
的run方法。抽象类也有类似的情况。我们可以使用一个示例进行测试:

公共抽象类AbstractClass{
公共方法(){
System.out.println(“抽象类”);
}
}
和另一类,即
TestClass

公共类TestClass{
公共静态void main(字符串[]args){
AbstractClass AbstractClass=新的AbstractClass(){
公共方法(){
System.out.println(“具体类方法”);
}
};
abstractClass.someMethod();
}
}
这将创建一个子类的实例,我们在其中重写
someMethod()
; 此程序打印:

具体类方法
这证明我们正在创建子类的实例

是否可以为接口创建对象

不是。您所展示的代码从实现接口的匿名类创建了一个对象。在封面下,JVM实际上创建了一个实现接口的类,然后创建了该类的实例


生成的“匿名”类实际上有一个名称,该名称基于该代码出现的类的名称,例如
YourClass$1
或类似名称。例如:

public class AnonymousName {
    public static final void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
            }
        };

        System.out.println(r.getClass().getName());
    }
}
…输出

AnonymousName$1 匿名姓名$1
(至少在Oracle的JVM上;我不知道命名约定是在JLS中还是JVM特有的行为。)

我们无法恢复接口(因为没有构造函数)。

您可以创建一个匿名内部类:

Runnable r = new Runnable() {
    @Override
    public void run() {
    }
};

因此,您创建了一个新的
,它实现了给定的
接口

,您看到的是一个

它正在创建一个新的、匿名的Runnable类实现者的实例


因为匿名类定义是一个表达式,所以它必须是语句的一部分。以下是我的理解

接口

public Interface SomeInterface{
}
可以为接口声明对象

SomeInterface anObject;
public class SomeClass implements SomeInterface {}
不能使用此接口直接实例化此对象。 但是,假设您有一个实现此接口的类

SomeInterface anObject;
public class SomeClass implements SomeInterface {}
然后你可以这样做

anObject = new someClass();
(这当然是概念上的(比如伪代码),实际代码可能会根据您的类和访问修饰符等而有所不同。)

我会尽快更新我们为什么要这样做/重点是什么


注意:上面的回答中已经提到了其中一些,只是想让OP也知道整件事。

这有点误导。OP的问题使用了匿名类语法,这可能是重点。我不这么认为。也许你能解决他的问题。你的答案是正确的。我想合适的地方是评论而不是回答。相关概念:这样做是为了实现抽象,在给出输出的同时隐藏实际实现的细节。例如:可以创建多个实例,但只使用接口的单个引用--anObject1=new FirstClass();anObject2=新的第二类();anObject3=新的第三类();与引用相对应,将触发3个类中的相应方法。目的?使用对象作为引用变量的目的是因为在运行时,我们不知道将创建哪个实例。。这样做是为了实现松耦合。