Java 如果没有关键字“QUOTE”,如何使用接口;实施;?

Java 如果没有关键字“QUOTE”,如何使用接口;实施;?,java,Java,可能重复: 在下面的代码示例中,我使用的是一个示例,其中包含变量“audiodecoder”和“cc”的初始化。这两个变量属于接口类型。但是,关键字implements在代码示例的任何地方都不会用于actionlisteners之外的任何东西 这与我迄今为止所学的关于Java的任何知识都背道而驰。我在下面列出了import语句,认为它们可能提供了一些线索,说明为什么IDecoder和ICodecContextWrapper没有相应的实现语句。我还试图找到一些关于以这种方式使用接口的文档,但没有

可能重复:

在下面的代码示例中,我使用的是一个示例,其中包含变量“audiodecoder”和“cc”的初始化。这两个变量属于接口类型。但是,关键字implements在代码示例的任何地方都不会用于actionlisteners之外的任何东西

这与我迄今为止所学的关于Java的任何知识都背道而驰。我在下面列出了import语句,认为它们可能提供了一些线索,说明为什么IDecoder和ICodecContextWrapper没有相应的实现语句。我还试图找到一些关于以这种方式使用接口的文档,但没有成功。有人能给我解释一下为什么不使用关键字implements?这个概念有没有一个名字,或者你知道的关于这个概念的一些文档

编辑:我还应该补充一点,变量在示例代码中也没有用关键字new声明

import org.libav.audio.Frame2AudioFrameAdapter;
import org.libav.audio.PlaybackMixer;
import org.libav.audio.SampleInputStream;
import org.libav.avcodec.ICodecContextWrapper;
import org.libav.avformat.IChapterWrapper;
import org.libav.avformat.IFormatContextWrapper;
import org.libav.avformat.IStreamWrapper;
import org.libav.avresample.bridge.AVResampleLibrary;
import org.libav.avutil.IDictionaryWrapper;
import org.libav.avutil.bridge.AVChannelLayout;
import org.libav.avutil.bridge.AVSampleFormat;
import org.libav.bridge.LibraryManager;
import org.libav.data.IFrameConsumer;
import org.libav.util.swing.VideoPane;


IDecoder audioDecoder = player.getAudioStreamDecoder(streamIndex);
ICodecContextWrapper cc = audioDecoder.getCodecContext();
这个

表示返回的任何内容都实现
IDecoder

e、 g

注意构造的内容和返回的引用之间的类型区别

返回的对象将是一个具体的类,但由于它实现了该接口,因此该接口可以引用它。它也可以实现其他接口,并且可以公开功能,但您只能作为
IDecoder

仅供参考: 根据,有两个类是
IDecoder
的具体实现:

  • 音频帧解码器
  • VideoFrameDecoder
您的
IDecoder
是这两个类之一的实例
IDecoder
还扩展了两个其他接口:

  • IFrameProducer
  • iPackConsumer
这同样适用于
icodeContextWrapper
。有三个已知类实现该接口:

  • AbstractCodeContextWrapper
  • CodecContextWrapper53
    ,以及
  • CodecContextWrapper54
您的
ICodeContextWrapper
是这三种包装之一的实例


这个概念叫做。如果它让人困惑(对初学者来说可能很好),你可以选择一些学习材料。

这已经在你之前的问题中得到了回答。播放器和音频解码器创建的对象实现了接口。如果您检查源代码是否可用,您会看到这一点。
player.getAudioStreamDecoder(streamIndex)
的返回类型是什么?只要想想
List List=new ArrayList()<代码>列表
也是一个界面。不,它不是,气垫船和科里。我想得到一个深入的解释,也许还有这个概念的名字。@user465001我必须同意满是鳗鱼的气垫船。我读了问题和答案。这个概念的名称是多态性。player是这样创建的:DefaultMediaPlayer=new DefaultMediaPlayer和DefaulMediaPlayer具有方法public IDecoder getAudioStreamDecoder(),返回类型为,我认为只是一个接口,IDecoder。当IDecoder应该是一个接口时,public IDecoder getAudioStreamDecoder()如何返回一个具体的类?@user465001:当方法的返回类型是一个接口时,它只意味着它可以返回实现
IDecoder
的任何类。从技术上讲,您使用的是一个具体的类,但您只能访问该接口中定义的方法/属性。这是我们的本性。其思想是,您不局限于单个实现,也不需要知道实现的细节。正确的
IDecoder
实现将根据上下文返回给您,可能使用了工厂模式。@Cory:Hi-Cory。谢谢你抽出时间来帮我。我对多态性有点了解,但是,这个项目中的语法增加了我的困惑。你的帮助在消除一些困惑方面非常有价值。@user465001:很高兴我能帮上忙。祝你的项目好运!
IDecoder audioDecoder = player.getAudioStreamDecoder(streamIndex);
public IDecoder getAudioStreamDecoder() {
   // constructs...
   return new IDecoderImplementation(); 
}