上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(三十一)-CSDN博客
六十三、接口里面可以写方法实现吗?
在Java中,接口(Interface)主要用于定义一组抽象方法,这些方法可以被实现接口的类具体实现。然而,从Java 8开始,接口也可以包含具有默认实现的方法,即默认方法(Default Methods)和静态方法(Static Methods)。以下是接口中可以包含的方法实现类型:
默认方法(Default Methods)
- 目的:允许在不破坏现有实现的情况下为接口添加新方法。
- 声明:使用
default
关键字声明,后面跟着方法体。 - 实现:接口中可以提供默认实现,实现接口的类可以选择使用这个默认实现,也可以覆盖它。
静态方法(Static Methods)
- 目的:提供工具类的功能,允许在接口中定义一些静态的工具方法。
- 声明:直接在接口中声明,不需要
default
关键字。 - 实现:接口中提供静态方法的实现,实现接口的类可以直接调用这些静态方法。
示例代码
interface MyInterface {// 抽象方法,必须由实现接口的类实现void abstractMethod();// 默认方法,接口提供了默认实现default void defaultMethod() {System.out.println("Default method implementation");}// 静态方法,接口提供了方法实现static void staticMethod() {System.out.println("Static method implementation");}
}class MyClass implements MyInterface {@Overridepublic void abstractMethod() {System.out.println("Abstract method implementation");}@Overridepublic void defaultMethod() {System.out.println("Overridden default method implementation");}
}public class Main {public static void main(String[] args) {MyClass myObject = new MyClass();myObject.abstractMethod(); // 调用抽象方法myObject.defaultMethod(); // 调用覆盖后的默认方法// 直接调用接口中的静态方法MyInterface.staticMethod();}
}
在这个示例中,MyInterface
接口包含了一个抽象方法abstractMethod()
,一个默认方法defaultMethod()
和一个静态方法staticMethod()
。MyClass
实现了MyInterface
接口,并提供了abstractMethod()
的实现,同时覆盖了defaultMethod()
以提供自定义的实现。staticMethod()
可以直接通过接口调用。
注意事项
- 抽象方法:实现接口的类必须实现所有的抽象方法,除非该类被声明为抽象类。
- 默认方法:如果多个继承的接口提供了具有相同签名的默认方法,实现类必须重写该方法以解决冲突,或者通过
super
关键字显式地选择使用哪一个接口的默认实现。 - 静态方法:不能被实现接口的类重写,因为它们属于接口,而不是实现类的一部分。
总结来说,虽然接口主要用于定义抽象方法,但Java 8之后,接口也可以包含默认方法和静态方法,这两种方法都可以在接口中提供具体实现。这为接口的使用提供了更大的灵活性,使得接口可以适应更多的编程场景。
六十四、抽象类必须要有抽象方法吗?
不,抽象类不必须包含抽象方法。在Java中,抽象类是使用 abstract
关键字声明的类,它允许包含抽象方法,也可以不包含。抽象类的主要目的是作为其他类的基类,提供一个通用的模板或框架。
抽象类的目的
- 提供一个通用的模板:定义一些通用的属性和方法,这些方法可以在子类中被重写以实现特定的行为。
- 实现部分功能:抽象类可以包含一些具体的实现,这些实现不需要在子类中改变。
- 不完整实现:抽象类可以定义一些未完成的方法(抽象方法),这些方法的具体实现留给子类完成。
抽象方法
- 抽象方法:没有方法体的方法,只有声明,它使用
abstract
关键字声明。 - 抽象类中可以有抽象方法,这样做的目的是强制任何继承该抽象类的子类都必须提供这些抽象方法的实现。
示例代码
abstract class Animal {// 抽象方法,必须由子类实现abstract void makeSound();// 具体方法,子类可以直接继承或重写void eat() {System.out.println("The animal is eating.");}
}class Dog extends Animal {@Overridevoid makeSound() {System.out.println("Woof woof!");}
}public class Main {public static void main(String[] args) {Animal myAnimal = new Dog(); // 使用抽象类的引用myAnimal.makeSound(); // 输出 "Woof woof!"myAnimal.eat(); // 输出 "The animal is eating."}
}
在这个示例中,Animal
是一个抽象类,它包含一个抽象方法 makeSound()
和一个具体方法 eat()
。Dog
类继承自 Animal
并提供了 makeSound()
的实现。
注意事项
- 不能实例化:由于抽象类可能包含未完成的方法,因此不能直接实例化。必须通过创建其子类的实例来使用抽象类。
- 继承:抽象类可以继承其他抽象类或具体类,并且可以被子类继承。
- 成员变量:抽象类可以包含成员变量,这些变量可以是具体的,也可以是抽象的(即没有具体的实现)。
总结来说,抽象类不一定非要有抽象方法,它可以包含任何类型的成员:具体方法、抽象方法、成员变量等。抽象类的主要角色是作为一个模板,为其他类提供一个通用的框架,同时强制实现某些未完成的方法。