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的),并且需要给出此方法的实现。

参考技术B 常量属性,方法必须是抽象的。由实现这个接口的具体子类来实现。总之,接口里面如果有属性必须定义成常量,方法必须是abstract修饰本回答被提问者采纳 参考技术C 用了。就不是抽象方法了。理解什么是抽象方法,什么是空方法吗。

为啥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就报错?的主要内容,如果未能解决你的问题,请参考以下文章

java里 class前边不加static为啥报错?

mybatis无法扫描到对应的mapper,启动没问题,调接口就报错?

为啥在android studio 布局中使用自定义控件就报错

HttpClient 中的putMethod上传100M的文件怎么设置,我上传小的不报错。20M就报java heap space 异常。

java中getSession写在方法里就可以,方法为就报错空指针

jquery代码如何写到外部js中 为啥 在外部js中 写上 $(document).ready(function();就报错