Java学习笔记 (十一)抽象,接口,以及之间的区别

前言:

还在学习的过程中

水平有限,不足之处望请斧正。

1、抽象

1.1、抽象方法和抽象类的概念

  • 抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。我们把没有方法体的方法称为抽象方法

    • 抽象方法没有方法体,只有方法名,必须用abstract修饰。
  • 抽象类: 如果一个类中存在抽象方法,那么该类就必须声明为抽象类

1.2、定义格式

抽象方法

修饰符 abstract 返回值类型 方法名 (参数列表);

public abstract void eat() ;

抽象类

abstract class 类名{
    
}

public abstract class Person{
    public void eat (){
        System.out.println("吃东西") ;
    }
}

注意:抽象类不一定有抽象方法,但是有抽象方法的类必须定义成抽象类

1.3、抽象类和抽象方法的注意事项

  1. 抽象类不能被实例化
  2. 抽象类不一定有抽象方法,但是有抽象方法的类必须定义成抽象类
  3. 抽象类可以有构造方法 (当创建子类对象时,可以给子类对象进行赋值)
  4. 抽象类的子类
    1. 要么重写抽象类中的所有抽象方法
    2. 要么为抽象类

2、接口

2.1、接口概念

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。简单的说,接口就是一种被规范的标准,只要符合这个标准都可以通用

2.2、接口的定义和使用

  • 接口使用关键字 interface 来定义
public interface 接口名{
    
}
  • 接口不能实例化
  • 接口和类之间是实现关系,通过 implements 实现
public class 类名 implements 接口名 {
    
}
  • 接口的子类 (也称实现类)

    • 要么重写接口中所有抽象方法
    • 要么是抽象类
  • 接口和类可以是单实现也可以是多实现

public class 类名 implements 接口1 , 接口2 ... {
    
}
  • 实现类在继承一个类的同时还可以实现多个接口
public class 类名 extends 类名 implements 接口1 , 接口2 ...{
    
}

2.3、接口中成员的特点

  • 成员变量

    • 只能是常量
    • 默认修饰符 : public static final
  • 构造方法:无

  • 成员方法

    • 只能是抽象类
    • 默认修饰符: public abstract
    • 注:JDK7 以前接口中只能定义抽象方法,JDK8 可以定义有方法体的方法(默认,静态),JDK9 接口中可以定义私有方法(普通,静态)

1、JDK8 以后允许在接口中定义默认方法,需要使用关键字default修饰

定义格式

public default 返回值类型 方法名 (参数列表){}

public default void show(){}

注意事项

  1. 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
  2. public可以省略,default不能省略
  3. 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写

2、JDK8 以后允许在接口中定义定义静态方法,需要用static修饰

定义格式

public static 返回值类型 方法名 (参数列表){}

public static void show(){}

注意事项

  1. 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
  2. public可以省略,static不能省略

3、JDK9 新增的方法,接口中可以定义私有方法

接口中私有方法的定义格式

格式一:
    private 返回值类型 方法名(参数列表){ }			//没有default

	private vpid show() { }

格式二:
	private static 返回值类型 方法名(参数列表){}

	private static void method() { }

2.4、继承和实现

类与接口是实现关系

接口与接口是继承关系

类与类是继承关系

  • 类和类的关系
    • 继承关系,只能单继承,不能多继承,但是可以多层继承
  • 类和接口的关系
    • 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口的关系
    • 继承关系,可以单继承,也可以多继承
    • 如果类实现的接口,还继承了其它接口,那么就需要重写所有的抽象方法

2.5、适配器模式

  • 一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
  • 适配器设计模式:解决接口与接口实现类之间的矛盾问题,当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
  • 书写步骤:
编写中间类XXXAdapter实现对应的接口
对接口中的抽象方法进行空实现
让真正的实现类继承中间类,并重写需要用的方法
为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰

代码示例

public interface Inter {
    public abstract  void method1();
    public abstract  void method2();
    public abstract  void method3();
}

//适配器,中间类

public abstract class AdaperInter implements Inter{
    @Override
    public void method1() {

    }

    @Override
    public void method2() {

    }

    @Override
    public void method3() {

    }
}


public class TestAdapter extends AdaperInter{
    @Override
    public void method1() {
        super.method1();
    }
}

3、接口和抽象的区别

参数抽象类接口
构造方法有构造方法,可以用于子类实例化没有构造方法
成员变量可以是变量也可以是常量只能是常量,默认 public static final
成员方法可以是抽象的也可以是非抽象的jdk 8之前只能是抽象的

选择依据

  1. 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。
  2. 如果想实现多继承,那么请使用接口,由于java不支持多继承,子类不能继承多个类,但一个类可以实现多个接口,因此可以使用接口来解决。
  3. 如果基本功能在不断变化,那么就使用抽象类,如果使用接口,那么每次变更都需要相应的去改变实现该接口的所有类

今天的分享就到这里了,期待与你共同进步!

如有不足欢迎留言指正 !

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值