Java 接口如何成为类成员并由类构造函数等实例化

Java 接口如何成为类成员并由类构造函数等实例化,java,Java,既然java接口不能被实例化,接口怎么可能是类成员并被类构造函数等实例化呢 jdk代码: public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable { private final Comparator<? super E> comparator; ... } 公共类优先级队列扩展了AbstractQueue 实现java.io.Ser

既然java接口不能被实例化,接口怎么可能是类成员并被类构造函数等实例化呢

jdk代码:

public class PriorityQueue<E> extends AbstractQueue<E>
    implements java.io.Serializable {
 private final Comparator<? super E> comparator;
...
}
公共类优先级队列扩展了AbstractQueue
实现java.io.Serializable{

private final Comparator语法
new Comparator(){…}
创建实现
Comparator
接口的匿名类的实例。因此,您正在创建类的实例

您永远不能创建接口的实例,只能创建实现该接口的类的实例


最后,可以将实现接口的类的实例分配给该接口类型的变量
创建实现
比较器接口的匿名类的实例。因此,您正在创建类的实例

您永远不能创建接口的实例,只能创建实现该接口的类的实例


最后,可以将实现接口的类的实例分配给该接口类型的变量。因此
private final Comparator如果您将类成员声明为接口类型,则可以将实现该接口的任何类分配给该成员。如果您不真正关心impl修订,只要接口中定义的方法可用

例如,
List
是一个接口。我可以将
ArrayList
LinkedList
(或任何其他实现)分配给
List
类型的变量,但我只能调用接口中定义的方法,而不能调用特定于任何实现类的方法


您在实例化
比较器时给出的代码实际上创建了一个实现该接口的匿名类。下面的方法是接口的实现方式。

如果您将类成员声明为接口类型,则实现该接口的任何类都可以分配给该成员。Thi如果您并不真正关心实现,那么只要接口中定义的方法可用,s就很有用

例如,
List
是一个接口。我可以将
ArrayList
LinkedList
(或任何其他实现)分配给
List
类型的变量,但我只能调用接口中定义的方法,而不能调用特定于任何实现类的方法

在实例化
比较器时给出的代码实际上创建了一个实现该接口的匿名类。下面的方法是接口的实现方式。

无法实例化接口这是一个相当笼统的口号,隐藏了一个更加微妙的现实,在学习语言的第一个月之后,不应该真正记住它

代码

new Comparator<Point>(){
            public int compare(Point p1,Point p2){
                ...
            }
        }
新比较器(){
公共整数比较(点p1,点p2){
...
}
}
做两件事:

编译时:创建一个实现接口的匿名类(通过为接口的方法提供具体的实现),并且该类还将具有通常的无参数构造函数,因此可以在运行时创建该类的实例

运行时:通过确保调用构造函数来创建该匿名类的运行时实例

所以“接口不能被实例化”意在解释一个人不能写

new List<X>();
newlist();
(即不提供接口方法的实现),但这并不意味着不可能创建作为实现接口的类实例的对象,即创建已知并保证符合接口的对象

“接口怎么可能是类成员”这个问题(以及它的措辞)也暴露了您在这里的一些困惑:代码

private final Comparator<? super E> comparator;
private final Comparator“接口无法实例化”是一个相当笼统的口号,它隐藏了一个更微妙的现实,在学习该语言的第一个月之后,不应该真正记住这一点

代码

new Comparator<Point>(){
            public int compare(Point p1,Point p2){
                ...
            }
        }
新比较器(){
公共整数比较(点p1,点p2){
...
}
}
做两件事:

编译时:创建一个实现接口的匿名类(通过为接口的方法提供具体的实现),并且该类还将具有通常的无参数构造函数,因此可以在运行时创建该类的实例

运行时:通过确保调用构造函数来创建该匿名类的运行时实例

所以“接口不能被实例化”意在解释一个人不能写

new List<X>();
newlist();
(即不提供接口方法的实现),但这并不意味着不可能创建作为实现接口的类实例的对象,即创建已知并保证符合接口的对象

“接口怎么可能是类成员”这个问题(以及它的措辞)也暴露了您在这里的一些困惑:代码

private final Comparator<? super E> comparator;

private final Comparator它与实现
Comparator
接口相同,并实例化实现并传递给
PriorityQueue
构造函数。它只是一个匿名类。它与实现
Comparator
接口相同,并实例化实现并传递给
构造函数ityQueue
constructor。它只是一个匿名类。太棒了~!如此简洁详细的答案完美地消除了我所有的困惑。太棒了!!太棒了~!如此简洁详细的答案太棒了