почему мы не можем использовать модификатор доступа по умолчанию и абстрактное ключевое слово вместе для метода в интерфейсе? - PullRequest
0 голосов
/ 05 октября 2018

Мне было просто интересно, почему у нас не может быть ключевых слов по умолчанию и абстрактных рядом друг с другом в интерфейсе?

public и abstract разрешены для интерфейса, а default по умолчанию является общедоступным, когда речь идет об одном и том же пакете,Так почему public abstract, а не default abstract?

Примечание: Это для более низких версий Java 7

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Ключевые слова являются взаимоисключающими. JLS говорит:

Ошибка времени компиляции, если объявление метода интерфейса содержит более одного из ключевых слов abstract, default или static.

Что касается ключевого слова abstract оно говорит :

Ошибка времени компиляции, если объявление метода интерфейса равно abstract(явно или неявно) и имеет блок для своего тела.

Но для методов с ключевым словом default оно требует :

СвойТело всегда представлено блоком, который обеспечивает реализацию по умолчанию для любого класса, который реализует интерфейс без переопределения метода.

Суммирование:

  • метод abstractне имеет тела
  • метод default обеспечивает тело

Невозможно иметь одно и другое одновременно.

0 голосов
/ 05 октября 2018

(до Java8) Беспорядок, возникающий из-за слова "default", модификатор доступа.Когда для метода не указан модификатор доступа, он называется default, но для более ранних версий Java 8 такого термина нет. Мы просто называем этот метод в default scope, но такого ключевого слова неткак 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");
    }

}

В приведенном выше примере бот-классы находятся в разных пакетах, и поэтому мы не можем переопределить метод def(), поскольку он не находится в области видимости.

0 голосов
/ 05 октября 2018

Кажется, вы что-то здесь неправильно истолковали.

в интерфейсе, все методы без тела считаются абстрактным методом.

метод по умолчанию - это новая функция с Java 8,

Его цель - решить совместимость со старой версией Java и помочь вам определить метод по умолчанию.

всякий раз, когда вы хотите использовать default, вы должны предоставить метод с реализацией тела.

Дополнительная информация: http://ocpj8.javastudyguide.com/ch04.html

...