好的,让我们看看我是否可以让这个问题“有意义”。以下代码示例旨在传达原则并反映代码背后的思想。如果您感兴趣的详细代码,则可以找到代码here。
我已经阅读了基础知识,咨询Java Tutorials(这是一个很好的资源),好的'Dietel'和文档。澄清一下:我是一名初学程序员。
我有三(3)个班级:
以下是他们的定义:
Simpe的确如此:
public interface ClassThatIsInterface {
public void doSomething(type variable);
}
public class ClassThatImplents implements ClassThatIsInterface {
// Here's the bit I hope to ask about, pt. 1 of 2:
ClassThatDoesSmthg instance = new ClassThatDoesSmthg(this,
appropriateVariable);
}
public class ClassThatDoesSmthg {
// And the second bit, pt. 2 of 2:
public ClassThatDoesSmthg (ClassThatIsInterface variableOne,
type appropriateVariable) {
}
我认为上面的代码片段应该为您提供足够的信息。
真的,问题的焦点是后两个类:ClassThatImplements
和ClassThatDoesSmthg
。
ClassThatDoesSmthg
期望作为其构造函数的一部分,类型为interface
class ClassThatIsInterface
;但是,发送给构造函数的是ClassThatImplements
类型的对象,它实现ClassThatIsInterface
。
显然,如果没有实现,new ClassThatDoesSmthg(this, appropriateVariable)
语句将失败(生成错误)。对我来说有趣的是什么;但是,当一个类implements
和一个interface
实现类 - 在这种情况下 - 被认为是一个is-a ClassThatIsInterface
(至少,它就是这样)。因此,声明成功了。
所以,这是我的问题:从概念上讲,ClassThatImplements
发生了什么,它被识别为ClassThatIsInterface
类型?
答案 0 :(得分:1)
一般来说,有三种方法可以看待继承
前两者紧密相连,甚至通常不单独考虑。
Java中用于帮助您实施这些类型继承的两个关键字是extends
和implements
。
前者仅允许单行继承,并且通过使用它,您可以创建上述所有三种类型的继承关系。
另一方面,后者允许您使用多重继承,但这仅限于类型的继承。 Java中不可能进行状态和行为的多重继承,而应该使用组合来实现类似的效果。
这基本上是Java被设计为一种语言的方式。如果您查看其他(或多或少)面向对象语言,您可以看到其他方法。 C ++在所有三个方面都支持多重继承(IMO并不是一件好事)。 Ruby允许您通过使用mixins来处理行为的继承,同样,在语言支持duck typing时,对类型的实施的关注较少。
所以,这是我的问题:从概念上讲,发生了什么
ClassThatImplements
被识别为类型的地方ClassThatIsInterface
?
总而言之,类实现接口的事实定义了两者之间的 is-a 关系。没有什么事情发生在幕后。
您可以查看Java Language Specification中子类型的确切规则。在你的情况下,它非常简单。当你看一下泛型类时,它会变得更有趣。尽管如此,这并不是最令人愉快的阅读。