抽象类与接口

1、抽象类

用abstract修饰的类就是抽象类

当一个方法没有实现价值的时候,永远不会执行该方法是,就把这个方法设置为抽象方法

1)概述

在JAVA中abstract是抽象的意思,可以修饰类和成员方法

抽象类:

修饰符 abstract class 类名{

​ 修饰符 abstract 返回值类型 方法名称(形参列表);//抽象方法

}

注意:抽象方法只有方法签名,不能声明方法体

​ 一个类中定义了抽象方法,这个类必须声明为抽象类

2)使用场景

继承抽象类时,一定要重写这个抽象类的全部抽象方法,不然这个类也要被定义成抽象类

3)抽象类的特征与注意事项

  1. 类有的东西,抽象类都有

  2. 抽象类中可以没有抽象方法,但是有抽象方法的类必然是抽象类

  3. 一个类继承了抽象类,必须重写玩抽象类的全部抽象方法,否则这个类也必须定义为抽象类

  4. 不能用abstract修饰变量、代码块、构造器

  5. 得到了抽象方法,失去了创建对象的能力-------反证法:假设可以创建,对象调用抽象方法时没有方法体。就算没有抽象方法他也是不完整的设计图

    //所以Animal a = new Animal();会报错
    //强制要求父类的引用指向子类的实例
    //即里氏替换原则
    Animal a = new Cat();
    
  6. final和abstract的关系:互斥关系(一个要继承一个不能继承,一个方法不能重写一个必须重写)

  7. 也不能同时用static 和abstract,因为static方法可以直接用类名.方法名调用 ,但抽象方法是没有方法体的

  8. 也不能同时用private和abstract(其他访问修饰符可以),因为抽象方法为私有就不能被实现了

4)设计模式:模板方法模式

当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。

实现步骤:

​ 1. 把功能定义成一个所谓的模板方法,放在抽象类中,模板方法只定义通用且能确定的代码。

  1. 模板方法不能决定的功能定义成抽象方法让具体子类去实现

但是最好设置为final修饰,因为其为模板用final修饰后就不能更改

2、接口

当一个类中所有的方法都没有具体实现价值的时候,这个类中所有的方法都是抽象方法的时候。我们就可以将其定义为接口。

接口也是一种数据类型----引用数据类型

1)接口概述

接口就是一种规范

常量默认public static final,方法默认public abstract

//格式如下:
//JDL1.8之前只能接口中只能定义常量和抽象方法
//声明一个接口:体现一种规范,规范则一定是公开的,默认类型就是public,可以不写
//常量默认public static final,方法默认public abstract
public interface 接口名{
	//常量----使用很少
	//抽象方法
}

2)接口的用法

接口是用来被类实现(implements)的,实现接口的类称为实现类,可理解为所谓的子类

修饰符 class 实现类 implements 接口1,接口2...{

}
//接口不能被实例化
//接口引用指向实现类的实例
//接口的多态!!!!!!!!!
	Usb usb = new ApplePhone();
	usb.meth();

接口可以被类单实现,也可被类多实现

注意:一个类实现接口,必须重写完全部接口的抽象方法,不然需要被定义为抽象类

接口中没有构造器、没有成员变量、成员方法

而抽象类中类有的他都有

3)接口与接口的关系:多继承

接口多继承的作用:规范合并,整合多个接口为同一个接口,便于子类实现

eg:用sportMan继承Law与People

这样BasketBallMan只需要implements Sportman(但里面要重写的方法还是一样的)

4)JDK 8后接口新增方法

允许接口中直接定义带有方法体的方法

但实际开发中接口仍然只定义抽象方法

  1. 默认方法
//类似之前写的普通实例方法:必须用default修饰
//默认会public修饰。需要用接口的实现类的对象来调用
default void run(){
	syso("--开始跑--");
}
  1. 静态方法
//默认会public修饰,必须static修饰
//注意:接口的静态方法必须用本身的接口名来调用
static void inAddr(){
syso("都在快乐学习");
}

​ 3. 私有方法

//就是私有的实例方法;必须用private修饰 jdk1.9才开始有
//只能在本类中被其他1的莫仍方法或私有方法访问
private void go(){
	syso("--准备--");
}

5)接口注意事项

  1. A接口继承多个接口,多个接口中有相同的抽象方法,继承后A接口中只有一个,实现类实现也只实现一个。

    一个实现类实现两个接口,接口中有一样的抽象方法也只用实现一个。

  2. 接口不能创建对象(接口更加彻底的抽象)

  3. 一个类实现多个接口,多个接口中有相同的静态方法不冲突

    接口的静态方法要用接口自己调用

  4. 一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的

    一个类在声明时要先写继承(extends)再写实现(implements)

  5. 一个类实现了多个接口,多个接口中存在同名的默认方法,不冲突,这个类要重写该方法

  6. 一个接口继承多个接口,是没有问题的,但如果多个接口中存在规范冲突则不能多继承

6)接口与抽象类的区别

相同点:
1、都不能实例化
2、都有抽象方法
不同点:
1、抽象类是用来被继承的(单继承),接口是用来实现的(多实现),也可以多继承
2、抽象类更多用来设计抽象属性,接口更多是设计用来抽象行为
3、抽象类可以有成员变量,但接口中的只有静态常量
4、抽象类有构造方法,接口中没有
posted @ 2022-05-18 19:36  夜色哪里都是美  阅读(47)  评论(0)    收藏  举报