目录
- java接口学习笔记
- 1. 抽象类和抽象方法
- 2. 接口
- 3. 抽象类和接口对比
- 参考
java接口学习笔记1. 抽象类和抽象方法
抽象方法:abstract void f();
抽象类:包含抽象方法的类称为抽象类。如果一个方法包含一个或多个抽象方法,则该类必须被定义为抽象类,否则编译器会产生错误消息。
示例:
public abstract class Basic { abstract void unimplemented();}
不允许使用private abstract
修饰方法,因为这样不能提供一个方法定义。
允许方法定义(和抽象方法可以混合使用),允许非静态变量(在每个对象里都会被分配存储)。
抽象类的继承:继承抽象类的新类型,如果要生成自己的对象,则必须要为基类中的所有方法提供方法定义。否则,子类也是抽象的,编译器强制你使用abstract
关键字来限定这个子类。
2. 接口
接口通常暗示“类的类型”或作为形容词来使用,例如Runnable或Serializable,而抽象类通常是类层次结构的一部分,并且是“事物的类型”,例如String。
abstract:默认不需要写,编译器会自动加上abstract
,包括类和方法。
字段:
- 隐式的
static
和final
,可以用来创建一组常量值; - 不能是空白的
final
,但是可以用非常量表达式初始化,例如Random.nextInt()
@Override: 可以使用,防止意外重载。
默认方法:default
关键字,实现该接口的类可以沿用。
JDK9+的版本中,接口里的static
和default
方法都可以是private
的;
示例:
default void jim(){ System.out.println("jim2"); }
接口的多重继承和多重实现:
- 使用方法签名(方法名请和参数类型)来区分不同的方法,返回类型不是签名的一部分;
- 当方法签名一致,但是内容不同的时候,必须重写冲突的方法(多重
implements
的时候处理方式相同); - 可以多重继承接口;
public interface Jim1 { void jim();}public interface Jim2 { default void jim(){ System.out.println("jim2"); }}public interface Jim3 extends Jim1,Jim2{ @Override default void jim() { Jim1.super.jim(); }}public class Jim implements Jim1,Jim2{ @Override public void jim() { Jim2.super.jim(); }}
接口作为参数的价值在于可以让任何类都适应它。
嵌套接口:参照《On Java基础卷》10.9
接口的private
方法:始于JDK9,private
方法可以省略default
关键字,编译器会加上。
新特性:密封类和密封接口,始于JDK17,可以用来限制实现的类,主要用于Java
模式匹配(JDK17新特性);
3. 抽象类和接口对比
特性 | 接口 | 抽象类 |
---|---|---|
组合 | 可以在新类中组合多个接口 | 只能继承一个抽象类 |
状态 | 不能包含字段(静态字段除外,但他们不支持对象状态) | 可以包含字段,非抽象方法可以引用这些字段 |
默认方法和抽象方法 | 默认方法不需要在子类型里实现,他只能引用接口里的方法(字段不行) | 抽象放合法必须在子类型里实现 |
构造器 | 不能有构造器 | 可以有构造器 |
访问权限控制 | 隐式的public | 可以为protected 或包访问权限 |
参考
[1] 《On Java 基础卷》