[Java面向对象]

Think twice, code once. / 2024-07-09 / 原文

面向对象

修饰符

接口

接口中方法的访问修饰符默认是public abstract

在 Java 接口中,接口中的方法默认是公共的(public),且不允许使用其他的访问修饰符。接口中定义的方法会被隐式地指定为 public abstract,这两个修饰符可以省略,因为它们是默认的。

所以,Java 接口中方法的定义形式通常是:

public interface MyInterface {
    void myMethod(); // 隐式的 public abstract
}

在 Java 8 及之后的版本中,接口还引入了默认方法(default methods)和静态方法(static methods)。这两种方法可以包含方法体,而不仅仅是声明。这两种方法的访问修饰符分别是:

  1. 默认方法(Default Methods):

    • 默认方法使用 default 关键字进行声明,它们在接口中有一个默认的实现。默认方法可以被接口的实现类继承或者覆盖。
    public interface MyInterface {
        default void myDefaultMethod() {
            // 默认方法的实现
        }
    }
    
  2. 静态方法(Static Methods):

    • 静态方法使用 static 关键字进行声明,它们在接口中有一个静态的实现。静态方法可以直接通过接口名调用,不需要通过实现类的实例调用。
    public interface MyInterface {
        static void myStaticMethod() {
            // 静态方法的实现
        }
    }
    

总结起来,Java 接口中方法的访问修饰符默认是 public abstract,但对于默认方法和静态方法,可以使用 defaultstatic 关键字进行修饰。默认方法和静态方法的引入使得接口可以包含一些具体的实现,而不仅仅是抽象方法。

实现接口的类,重写接口中的方法时,应该将访问修饰符定为public

当一个类实现一个接口时,类需要遵循以下访问修饰符的要求:

  1. 接口方法实现:
  • 实现类必须提供接口中定义的所有方法的实现,包括默认方法。如果不提供全部方法的实现,那么该类必须声明为抽象类(abstract)。
  1. 接口方法的访问修饰符:

    • 实现类中的方法必须使用 public 访问修饰符,因为接口中的方法默认是 public 的。如果使用其他访问修饰符(例如 protectedprivate),会导致编译错误。
    public class MyClass implements MyInterface {
        public void myMethod() {
            // 实现接口方法
        }
    
        // 实现默认方法
        public void myDefaultMethod() {
            // 默认方法的实现
        }
    }
    
  2. 接口中静态方法的访问:

    • 静态方法可以通过接口名直接调用,不需要实现类提供具体实现。实现类可以选择提供一个相同签名的静态方法,但这只是一个静态方法而不是接口中的静态方法的实现。
    public class MyClass implements MyInterface {
        public void myMethod() {
            // 实现接口方法
        }
    
        // 实现默认方法
        public void myDefaultMethod() {
            // 默认方法的实现
        }
    
        // 提供一个静态方法,但不是接口中的静态方法的实现
        public static void myStaticMethod() {
            // 静态方法的实现
        }
    }
    

总体来说,实现类中实现接口的方法需要使用 public 访问修饰符,并提供接口中所有抽象方法的具体实现。对于默认方法和静态方法,可以选择性地提供实现。

抽象类和接口的区别

  1. 抽象类用来继承,接口用来实现,定义规范

  2. 抽象类用来规定对象长什么样子,但是接口用来规定对象有什么行为。

  3. 接口中的成员变量只能是public static final类型的,静态方法和默认方法只能是public或private访问级别,抽象方法只能是public访问级别。

  4. 抽象类中可以定义各种类型的成员变量,并且成员方法可以处于四种访问级别。这是抽象类的优势所在,它可以包含所有子类的共同实例变量,避免在子类中重复定义,而且抽象类可以利用四种访问级别来灵活地设定对实现细节的封装程度。

  5. 一个类只能继承一个直接的父类;但一个类可以实现多个接口,这是接口的优势所在,也就是我们可以利用接口实现多继承。

    对于已经存在的[继承树],由于一个类允许实现多个接口,因此可以方便地从类中自下而上抽象出新的接口。另一方面,由于一个类只能继承一个直接的[父类],因此从类中自下而上抽象出新的抽象类却不那么容易。所以接口更有利于软件系统的维护与重构。

    从语义上有区分,接口是对多个类的共同行为(或者说对外提供的服务)的抽象,抽象类是对根据多个类的共性(包括属性和行为)进行的类型抽象。

(1)接口是软件系统中最高层次的抽象,声明了软件系统对外提供的服务。

(2)接口本身必须十分稳定,接口一旦制定,就不允许随意修改,否则会对接口的实现类以及接口的访问类都造成影响。

(3)通常用抽象类来定制软件系统中的扩展点。可以把抽象类看作是介于“抽象”和“实现”之间的半成品,抽象类力所能及地完成了部分实现细节,但还有一些功能有待于它的子类去实现和扩展。

我之前写过一个项目,我需要一个抽象的缓存框架,其中就用到了抽象类,这个抽象类本身就带有三个hashmap,所以我们只需要继承这个类就可以直接使用这三个hashmap,