抽象类和接口
1、抽象类
在继承的层次结构中,每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追溯,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计的非常抽象,以至于他都没有任何具体的实例。这样的类称为抽象类。
在类的头部使用abstract修饰符表示该类为抽象类。
1.1抽象类和常规类很像,但是不能使用new操作符创建它的实例。抽象方法只有定义而没有实现。它的实现由子类提供。一个包含抽象方法的类必须声明为抽象类。
1.2抽象类的构造方法定义为protected,因为它只被子类使用。创建一个具体子类的实例时,其父类的构造方法被调用以初始化父类中定义的数据域.
2、抽象类的几点说明
抽象方法不能包含在非抽象类中;
抽象类不能使用new操作符来初始化;
包含抽象方法的类必须时抽象的;
子类可以重写父类的方法并将它定义为抽象的;
即使子类的父类是具体的,这个子类也可以是抽象的;
不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以作为一种数据类型。
抽象类:拥有抽象函数的类就是抽象类
但是抽象类不一定一定包含抽象函数吗
继承抽象类的子类 要么实现抽象函数 要么接着声明为抽象类
抽象:模糊不定,不确定,不明白,不清晰
3、抽象函数
抽象函数:从代码上而言 只有函数的声明但是没有函数体
当描述一类事物的时候,发现每个事物都有相同的功能,但是具体执行却不一样
那么在对这些事物进行父类抽取的时候,仅仅保留该功能的声明,而无需写出函数体此时,这个函数就是抽象函数,该函数的具体执行由子类决定。
4、抽象类问题
4.1.抽象类有构造函数
抽象类一般而言是作为父类存在的
子类在创建对象是,服父类肯定会为其进行一些初始化
所以抽象类肯定有构造函数!
4.2.抽象类不能创建对象
因为就算抽象类能创建出对象,但是其函数没有具体的执行,是不确定的
对象本身就是一个确定的东西,所以冲突。
4.3.抽象类和一般类有何区别?
唯一区别就在于抽象类有抽象函数
其余一律和一般类相同!
有构造函数 有成员变量 有成员函数 静态也有
4.4.抽象函数不能和那些关键字共存?
final 修饰函数 表示该函数并不能被重写
final 修饰类 表示该类不能被继承
private
static 静态不存在重写的概念 静态必须是一个具体的事物
5、接口
接口是一种与类相似的结构,用于为对象定义共同的操作。
接口在许多方面都与抽象类很相似,但是它的目的是指明相关或者不相关的对象的共用行为。例如:使用适当的接口,可以指明这些对象是可比较的、可食用的或者可克隆的。
为了区分接口和类,Java采用下面的语法来定义接口:
modifier interface InterfaceName{…}
如:
public interface Edible{
/*Describe how to eat*/
public abstract String howToEat();
}
接口interface:从代码上而言 就是一种特殊的抽象类!
当一个抽象类中,所有的函数都是抽象的,则可以用接口去表示。
在接口中
属性 public static final 常量
行为 public abstract 抽象函数
1.解耦
向外提供一套统一标准 USB Type-C
2.*传参(基本数据类型,引用数据类型,一段代码)
3.对事物功能的拓展
类与类之间只有单继承的关系 extends
类与接口之间有多实现的关系 implements
接口与接口之间有多继承的关系
因为一个子类的父类1与父类2之间 纵使有同名函数 但是有不同函数体 所以导致子类无法确定执行哪个
但是一个子类的接口1与接口2之间 纵使有同名函数 但是没有执行体 执行体由实现子类自行决定 所以不冲突
6、接口与抽象类
一个类可以实现多个接口,但是只能继承一个父类。
不同点
Java中只允许为类的继承做单一继承,但是允许使用接口做多重继承。例如
public class NewClass extends BaseClass
implements Interface1,....,InterFaceN{...}
利用关键字extends,接口可以继承其他接口。这样的接口称为子接口。例如下面代码块中NewInterface是Interface1,…,InterfaceN的子接口。
public interface NewInterface extends Interface1,...,InterfaceN{...}
一个类的实现Newface的类必须实现在NewInterface,Interface1,…,InterfaceN中定义的抽象方法。接口可以继承其他接口但不能继承类。一个类可以继承它的父类同时实现多个接口。
AbstractDemo1
InterefaceDemo1
InterfaceDemo2
InterfaceDemo3
SingleDemo
StackDemo2