代码之家  ›  专栏  ›  技术社区  ›  Jayanth

为什么我们不能将默认访问修饰符和抽象关键字一起用于接口中的方法?

  •  -2
  • Jayanth  · 技术社区  · 6 年前

    我只是想知道为什么我们不能在一个界面中把默认关键字和抽象关键字放在一起?

    public abstract 而不是 default abstract ?

    这适用于Java7的较低版本

    3 回复  |  直到 6 年前
        1
  •  1
  •   Huy Nguyen    6 年前

    你好像误解了什么。

    在一个接口中,所有没有实体的方法都被认为是抽象方法。

    默认方法是Java8的新特性,

    它的目的是解决与旧java版本兼容的问题,并帮助您定义一个默认方法。

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

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

        2
  •  1
  •   LuCio    6 年前

    JLS 说:

    不止一个关键字 abstract , default ,或 static .

    关于关键字 says :

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

    但是对于带有关键字的方法 违约 requires

    任何实现接口的类的实现

    总结:

    • 摘要 方法没有正文
    • 方法提供了一个主体

        3
  •  0
  •   Jayanth    6 年前

    (在Java8之前)出现的混乱是 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() 因为它不在范围之内。