我正在研究Java类和继承,我对接口有疑问。
根据Oracle文档,LinkedList类实现了可序列化、可克隆、可重用、集合、定义、列表和队列。
因为Iterable是一个接口,而不是像LinkedList那样的类,所以它必须实现一个默认迭代器,不是吗?如果理解正确,我在哪里可以看到实现?
您将在链表类本身中找到iterable接口方法的实现。
简单的回答是,在源代码中。
更长的答案是LinkedList
本身不需要实现iterator()
方法,如果它继承自另一个可能实现它的类。如果您仔细查看LinkedList的javadoc,您可以看到LinkedList没有定义iterator()
方法,但当您实现Iterable
时,它应该在那里。查看末尾,您还可以看到继承方法的部分。具体看“从类java.util.AbstractSequentialList继承的方法”,其中列出了iterator()
。
现在我们已经确定,iterator
实际上在java中。util。抽象顺序列表
。因此,要找到实现,您可以查看AbstractSequentialList
的源代码,它是:
public Iterator<E> iterator() {
return listIterator();
}
现在如您所见,实现依赖于listIterator()
的实现。LinkedList
没有实现listIterator()
方法(它有一个带一个参数的方法,但这需要无参数方法)。所以再次查看javadoc,我们可以在“继承自类java.util.AbstractList的方法”下发现listIterator()
方法是从那里继承的。所以查看AbstractList
中的源代码:
public ListIterator<E> listIterator() {
return listIterator(0);
}
现在,在LinkedList
类中实现了listIterator(int)
方法。从LinkedList
的源代码:
public ListIterator<E> [More ...] listIterator(int index) {
checkPositionIndex(index);
return new ListItr(index);
}
如果您需要进一步分析is的功能,可以从那里继续。
因为Iterable是一个接口,而不是像LinkedList这样的类,所以它一定实现了默认迭代器,不是吗?
不是真的,如果超类重写了方法,那么子类就不必。。。
看看这个:
interface IFoo {
int getFoo();
}
class A implements IFoo {
@Override
public int getFoo() {
// TODO Auto-generated method stub
return 0;
}
}
class B extends A {
// ...
}
class C extends A implements IFoo {
// ...
}
注意c类是如何编译的,即使它(冗余地)实现了Ifoo,但没有覆盖getFoo方法(这只可能是因为c扩展了一个)
这门课看起来像:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
其中AbstractCollection看起来像:
public abstract class AbstractCollection<E> implements Collection<E> {
因此,它们确实覆盖了interface Iterable中的方法
它只是说: 返回以此集合为源的顺序流。 当spliterator()方法无法返回不可变、并发或后期绑定的spliterator时,应重写此方法。(有关详细信息,请参见拆分器() 但我找不到任何显示它如何创建和返回新流的代码。 是一个
我想知道gensim的LDA(潜在Dirichlet分配)算法的默认迭代次数。我认为文档中没有提到这一点。(迭代次数由初始化LdaModel时的参数迭代次数表示)。谢谢
当前:Bag$Node@1786F9D5下一个:Bag$Node@704D6E83 看起来很清楚,至少在我看来,下一个节点每次都会设置一个新节点。我将所有四个元素都添加到包中,但条目丢失,并为每个索引返回null。toArray()函数显示 我敢肯定这是一件简单得让人眼花缭乱的事情。下面是整个实现。
问题内容: 如果没有覆盖该方法,默认的实现是什么? 问题答案: 然后,此类从其祖先之一继承。如果它们都不覆盖它,则使用Object.hashCode。 从文档: 在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但是JavaTM编程语言不需要此实现技术。) 因此默认实现是特定于JVM的
问题内容: 如果我写这样的话 哪种类型带有“ 18”?是 int 还是 byte ?还是还没有类型? 它不能是int,因为这样是正确的: 这是不正确的: 编辑:我想我在工作分配转换的规范中找到了正确的部分: 常量的编译时缩小意味着代码如下: 字节theAnswer = 42; 被允许。如果不进行缩小,则整数文字42具有int类型的事实意味着将需要强制转换为字节: 字节theAnswer =(字节)
问题内容: 我试图理解Java对象的hashCode(),并看到Java对象的hashCode()方法的以下代码: 因此,该类即:将隐式扩展该类。 主班: 正如隐式扩展类一样,因此它将具有类的方法。 我调用了on 对象,但由于尚未覆盖on ,因此从理论上讲它应该调用class的。 我的疑问是: 由于Object类没有任何实现,因此如何计算任何对象的哈希码? 就我而言,当我运行该程序时,它返回的哈希