为什么不能在接口的方法中同时使用默认访问修饰符和abstract关键字?

时间:2018-10-05 07:11:44

标签: java interface java-6

我只是想知道为什么我们不能在界面中使用默认关键字和抽象关键字?

接口允许使用

public和abstract,而对于同一包,默认情况下默认为public。那么为什么public abstract而不是default abstract呢?

注意:这是针对Java 7较低版本的

3 个答案:

答案 0 :(得分:1)

似乎您在这里误解了一些东西。

在接口中,所有没有主体的方法都被视为抽象方法。

默认方法是Java 8的新功能

目的是解决与旧Java版本的兼容性并帮助您定义默认方法。

无论何时要使用默认值,都必须提供带有主体实现的方法。

更多信息:http://ocpj8.javastudyguide.com/ch04.html

答案 1 :(得分:1)

关键字是互斥的。 JLS说:

  

如果接口方法声明包含更多内容,则是编译时错误   而不是关键字abstractdefaultstatic中的一个。

关于关键字abstractsays

  

如果接口方法声明为,则是编译时错误   abstract(显式或隐式),其主体具有一个块。

但是对于关键字为default且为requires的方法:

  

其主体始终由一个块表示,该块提供了默认值   任何实现接口的类的实现   覆盖该方法。

总结:

  • abstract方法没有正文
  • 一种default方法提供了一个正文

不可能同时拥有一个和另一个。

答案 2 :(得分:0)

(在Java8之前)发生的混淆是单词“ default”访问修饰符。如果没有为方法指定访问修饰符,则将其称为default,但是对于Java 8的早期版本则没有这样的术语。我们只是将该方法归为default范围,但是这里有没有用于访问修饰符的default这样的关键字。

package com.stackOverflow;

import java.util.HashMap;

public abstract class Student {

    private String name ;
    private String address;
    private HashMap<Integer, Integer> testMarks;


    public Student(String name,String address) {
        this.name = name;
        this.address = address;
        testMarks.put(1, 0);
        testMarks.put(2, 0);
        testMarks.put(3, 0);

    }

     abstract void def();// no access modifier and hence it is in default state
}

package com.stackOverflow.Interface;

import com.stackOverflow.Student;

public class anumal extends Student {

    public anumal(String name, String address) {
        super(name, address);
        // TODO Auto-generated constructor stub
    }

    public void def() {
        System.out.println("hi");
    }

}

在上面的示例中,bot将类放在不同的包中,因此我们无法覆盖方法def(),因为它不在范围内。