java接口中的方法为啥不是static就报错?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java接口中的方法为啥不是static就报错?相关的知识,希望对你有一定的参考价值。
public interface Printable void printItMyWay()
Java8给出了接口新特性,接口中的方法可以用static和default修饰,用这两个关键词修饰的方法可以有具体实现,实现该接口的类可以不重写该方法,类似于继承。而没有用这两个关键词修饰的方法则默认是public abstract的。至于某些书上说的,接口内的方法必须是public abstract的,基本上都是以前的老版本(Java8以下),已经跟不上现在的节奏了。 参考技术A 接口中所有的方法都是抽象方法,不能有实现,如果要给出实现,必须将方法声明为static或default。追问您好,可是书上说接口中所有的方法都必须是默认的public abstract,无论是否有修饰符显式地限定它。
追答如果没有显式地使用public abstract修饰接口中的方法,那么方法就是public abstract的。
但是,如果用static或default修饰了某个接口中的方法,那么方法就不是abstract的(仍然是public的),并且需要给出此方法的实现。
为啥Iterable接口中的forEach方法不是抽象的? [复制]
【中文标题】为啥Iterable接口中的forEach方法不是抽象的? [复制]【英文标题】:Why the forEach method in Iterable interface is not abstract? [duplicate]为什么Iterable接口中的forEach方法不是抽象的? [复制] 【发布时间】:2017-08-17 09:40:12 【问题描述】:当我看到 Iterable 接口源时,看起来foreach
方法和Spliterator
方法不是抽象的。接口如何具有非抽象方法?或者我有什么遗漏吗?见下方Iterbale
接口源码。
package java.lang;
import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;
public abstract interface Iterable<T>
public abstract Iterator<T> iterator();
public void forEach(Consumer<? super T> paramConsumer)
Objects.requireNonNull(paramConsumer);
Iterator localIterator = iterator();
while (localIterator.hasNext())
Object localObject = localIterator.next();
paramConsumer.accept(localObject);
public Spliterator<T> spliterator()
return Spliterators.spliteratorUnknownSize(iterator(), 0);
/* Location: C:\Program Files\Java\jre1.8.0_121\lib\rt.jar
* Qualified Name: java.lang.Iterable
* Java Class Version: 8 (52.0)
* JD-Core Version: 0.7.1
*/
【问题讨论】:
是的,Java 8 接口可以有默认方法。阅读 Java 教程,或自 Java 8 出现之前编写的大量博客文章和文章。 这看起来不像实际的源代码。forEach
应声明为 default
。为什么它被声明为abstract interface
?你在看什么版本?
@Tom 它是 Java 类版本:8 (52.0)
不,不是。它看起来不像那样。除非您使用反编译器而不是查看实际源代码。
src.zip 中的类和反编译版本(使用 Fernflower 反编译器)都不是这样。
【参考方案1】:
使用 Java 8,您可以在接口中定义 default implementation。
这就是java.lang.Iterable
所做的:
public interface Iterable<T>
...
default void forEach(Consumer<? super T> action)
Objects.requireNonNull(action);
for (T t : this)
action.accept(t);
...
您的实际代码并未引用 Java 8 源代码。
【讨论】:
我的代码是指 java 8 源码。 /* 位置:C:\Program Files\Java\jre1.8.0_121\lib\rt.jar * 限定名称:java.lang.Iterable * Java 类版本:8 (52.0) * JD-Core 版本:0.7.1 * / 它是已编译类的可查看版本,而不是类的源代码。这是源代码:grepcode.com/file_/repository.grepcode.com/java/root/jdk/… 我在 eclipse 中看到代码,可能这就是它显示编译版本的原因。 如果Eclipse以这种方式显示源代码,则意味着Eclipse不知道源代码在哪里。在首选项->已安装的 JRE 中,编辑您正在使用的 JDK/JRE。您应该有源附件按钮来指定代码源的位置。以上是关于java接口中的方法为啥不是static就报错?的主要内容,如果未能解决你的问题,请参考以下文章
mybatis无法扫描到对应的mapper,启动没问题,调接口就报错?
为啥在android studio 布局中使用自定义控件就报错
HttpClient 中的putMethod上传100M的文件怎么设置,我上传小的不报错。20M就报java heap space 异常。
java中getSession写在方法里就可以,方法为就报错空指针
jquery代码如何写到外部js中 为啥 在外部js中 写上 $(document).ready(function();就报错