一.什么是抽象类
- 简单理解的来说就是不够具体的类,具体的反义词—抽象.
- 比如说一个图形,这就不够具体,一个图形可以具体的细分为三角形,圆形,长方形等等,三角形又可以更加具体,等腰三角形,等边三角形等等 .而抽象类就是将明显具有自己独特特征的具体类模糊化,将大家都有的共同特征抽象出来,比如说医生类,护士类,士兵类,可以通通抽象为—人类.他们都拥有人类的特征,比如说吃饭,睡觉,娱乐之类的,这些执行的方法都是相似的代码,用抽象类抽象出来,再通过子类继承实现就可以大大减少代码量(偷懒+_+).
- 抽象类也是普通类前加上了abstarct关键字,同样,一个普通方法前加上了这个关键字也就成为了抽象方法.
二.如何使用抽象类
- 不能直接创建(new)抽象类对象
- 必须用一个子类来继承抽象类
- 子类必须覆盖重写抽象父类中的所有抽象方法,否则会编译报错,除非该子类也是抽象类
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后然后方法体大括号 - 创建子类进行使用
注意:
- 抽象类中,可以有构造方法(有默认的super()),是供子类创建对象时,初始化父类成员使用的
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
三.接口
1. 什么是接口
接口就像是一种公共规范标准,如同国标,众多工厂其实互相不认识,不联系,但造出来的东西就是能够一起使用.比如也像一个USB接口,U盘,充电宝,随身小风扇都有这个借口,U盘可以插在苹果电脑上,也可以插在DELL电脑上,因为大家共同遵守着一种规范标准.
接口是一种引用数据类型,最重要的内容就是其中的:抽象方法。
如何定义一个接口的格式:
public interface 接口名称
{
// 接口内容
}
注意:换成了关键字interface之后,编译生成的字节码文件仍然是:.java --> .class。
2. 如何使用接口
如果是Java 7,那么接口中可以包含的内容有:
- 常量
- 抽象方法
如果是Java 8,还可以额外包含有:
- 默认方法
- 静态方法
如果是Java 9,还可以额外包含有:
- 私有方法
接口使用步骤:
- 接口不能直接使用,必须有一个“实现类”来“实现”该接口。
格式:
public class 实现类名称 implements 接口名称
{
// ...
}
- 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
实现:去掉abstract关键字,加上方法体大括号。 - 创建实现类的对象,进行使用。
接口中的常量
注意:
- 接口当中的常量,可以省略 public static final, 不写也默认是这样
- 接口当中的常量必须进行复制,不能不赋值
- 接口中常量使用完全大写字母,用下划线进行分割(推荐命名规则
接口中的抽象方法
注意:
- 如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。
在任何Java版本中,接口都能定义抽象方法
格式:
public abstract 返回值类型 方法名称(参数列表)
注意:
- 接口当中的抽象方法,修饰符必须是两个固定的关键字: public abstract
- 这两个关键字修饰符,可以选择性省略
- 方法的三要素:返回值类型,方法名称,参数列表 可以根据业务情况随意定义
- 如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
- 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。
接口中的默认方法
从Java 8开始,接口里允许定义默认方法。
格式:
public default 返回值类型 方法名称(参数列表)
{
方法体
}
接口当中的默认方法,可以解决接口升级的问题
public interface MyInterfaceDefault
{
// 抽象方法
public abstract void methodAbs();
// 新添加了一个抽象方法
// public abstract void methodAbs2();
// 新添加的方法,改成默认方法
public default void methodDefault()
{
System.out.println("这是新添加的默认方法");
}
}
注意
- 如果实现类所实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
- 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法
接口中的静态方法
接口当中定义静态方法
格式:
public static 返回值类型 方法名称(参数列表){}
注意:
-
不能通过接口实现类的对象来调用接口当中的静态方法
正确用法:通过接口名称,直接调用其中的静态方法 -
接口是没有静态代码块或者构造方法的。
-
一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。
格式:
public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB
{
// 覆盖重写所有抽象方法
}
格式:
接口名称.静态方法名(参数);
public interface MyInterfaceAbstract //接口
{
public static final int num = 10;//
//这是一个抽象方法
public abstract void method1();
//下面的都是抽象方法
public void method2();
abstract void method3();
void method4();
public default void method05()
{
System.out.println("我是在接口里新添加的默认方法");
}
public static void staticMethod()
{
System.out.println("我是接口里的静态方法");
}
}
public class MyInterfaceAbstractImpl implements MyInterfaceAbstract
{ //用一个实现类继承接口
@Override
public void method1()
{
System.out.println("这是第一个抽象方法");
}
@Override
public void method2()
{
System.out.println("这是第2个抽象方法");
}
@Override
public void method3()
{
System.out.println("这是第3个抽象方法");
}
@Override
public void method4()
{
System.out.println("这是第4个抽象方法");
}
}
public static void main(String[] args) //主方法
{
MyInterfaceAbstractImpl im = new MyInterfaceAbstractImpl();
im.method1();
im.method2();
im.method05();//接口里新添加的默认方法
im.method3();
//通过接口名称来调用静态方法
MyInterfaceAbstract.staticMethod();
}
接口中的私有方法
- 普通私有方法,解决多个默认方法之间重复的代码问题
格式:
private 返回值类型 方法名称(参数列表) - 静态私有方法 解决多个静态方法之间重复代码的问题
private static 返回值类型 方法名称(参数列表)
四.接口小结
接口内容小结:
在Java 9+版本中,接口的内容可以有:
-
成员变量其实是常量,格式:
public static final 数据类型 常量名称 = 数据值;
注意:
常量必须进行赋值,而且一旦赋值不能改变。
常量名称完全大写,用下划线进行分隔。 -
接口中最重要的就是抽象方法,格式:
public abstract 返回值类型 方法名称(参数列表);
注意:
实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类。 -
从Java 8开始,接口里允许定义默认方法,格式:
public default 返回值类型 方法名称(参数列表) { 方法体 }
注意:
默认方法也可以被覆盖重写 -
从Java 8开始,接口里允许定义静态方法,格式:
public static 返回值类型 方法名称(参数列表) { 方法体 }
注意:
应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法 -
从Java 9开始,接口里允许定义私有方法,格式:
普通私有方法:private 返回值类型 方法名称(参数列表) { 方法体 }
静态私有方法:private static 返回值类型 方法名称(参数列表) { 方法体 }
注意:
private的方法只有接口自己才能调用,不能被实现类或别人使用。 -
类与类之间是单继承的。直接父类只有一个。
-
类与接口之间是多实现的。一个类可以实现多个接口。
-
接口与接口之间是多继承的。
-
多个父接口当中的抽象方法如果重复,没关系。
-
多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,(要带着default关键字)
抽象类与接口区别图
来源:CSDN
作者:InightI
链接:https://blog.csdn.net/weixin_43501384/article/details/104580891