面向对象之抽象

关键词abstract声明的类叫作抽象类,abstract声明的⽅法叫抽象⽅法

⼀个类⾥包含了⼀个或多个抽象⽅法,类就必须指定成抽象类

抽象⽅法属于⼀种特殊⽅法,只含有⼀个声明,没有⽅法体

抽象⽀付

pay(⾦额,订单号),默认实现是本地⽀付,微信⽀付,⽀付宝⽀付,银⾏卡⽀付

抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。

抽象只关注对象有哪些属性和行为,并不关注这些行为的 细节是什么。

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面:一是过程抽象;二是数据抽象。(另一种解释)

1.抽象类必须要有抽象⽅法吗? 不需要,抽象类不⼀定⾮要有抽象⽅法。

示例代码:

abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
上⾯代码,抽象类并没有抽象⽅法但完全可以正常运⾏。

2.普通类和抽象类有哪些区别? 普通类不能包含抽象⽅法,抽象类可以包含抽象⽅法。 抽象类不能直接实例化,普通类可以直接实例化。

3.抽象类能使⽤ final 修饰吗? 不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产⽣⽭盾,所 以 final 不能修饰抽象类,

4.接⼝和抽象类有什么区别?

实现:抽象类的⼦类使⽤ extends 来继承;接⼝必须使⽤ implements 来实现接⼝。

构造函数:抽象类可以有构造函数;接⼝不能有。

实现数量:类可以实现很多个接⼝;但是只能继承⼀个抽象类。

访问修饰符:接⼝中的⽅法默认使⽤ public 修饰;抽象类中的⽅法可以是任意访问修饰符。

抽象类(abstract class)与接口(interface)有什么异同?

如果一个类中包含抽象方法,那么这个类就是抽象类。在Java语言中,可以通过把类或者类中的某些方法声明为abstract(abstract只能用来修饰类或者方法,不能用来修饰属性)来表示一个类是抽象类。接口就是指一个方法的集合,接口中的所有方法都没有方法体,在Java语言中,接口是通过关键字interface来实现的。 抽象类(abstract class)和接口(interface)都是支持抽象类定义的两种机制(注意:此句中的前后两个抽象类的意义不一样,前者表示的是一个实体,后者表示的是一个概念)。二者具有很大的相似性,甚至有时候是可以互换的。但同时,二者也存在很大的区别。 只要包含一个抽象方法的类就必须被声明为抽象类,抽象类可以声明方法的存在而不去实现它,被声明为抽象的方法不能包含方法体。在实现时,必须包含相同的或者更低的访问级别(public→protected→private)。抽象类在使用的过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。抽象类的子类为父类中的所有抽象方法提供具体的实现,否则它们也是抽象类。接口可以被看作抽象类的变体。接口中的所有方法都是抽象的,可以通过接口来间接地实现多重继承。接口中的成员变量都是static final类型。由于抽象类可以包含部分方法的实现,因此,在一些场合下抽象类比接口存在更多的优势。

接口与抽象类的相同点如下: 1)都不能被实例化。 2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化。

接口与抽象类的不同点如下: 1)接口只有定义,其方法不能在接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。 2)接口需要实现(用implements),但抽象类只能被继承(用extends)。一个类可以实现多个接口,但一个类只能继承一个抽象类,因此使用接口可以间接地达到多重继承的目的。 3)接口强调特定功能的实现,其设计理念是“has-a”关系;而抽象类强调所属关系,其设计理念为“is-a”关系。 4)接口中定义的成员变量默认为public static final,只能够有静态的不能被修改的数据成员,而且,必须给其赋初值,其所有成员方法都是public、abstract的,而且只能被这两个关键字修饰。而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法,而且,抽象类中的成员变量默认为default(本包可见),当然也可以被定义为private、protected和public,这些成员变量可以在子类中被重新定义,也可以被重新赋值,抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号。所以,当功能需要累积时,用抽象类;不需要累积时,用接口。 5)接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法;而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改。 简单点说,接口是一种特殊形式的抽象类,使用接口完全有可能实现与抽象类相同的操作,但一般而言,抽象类多用于在同类事物中有无法具体描述的方法的场景,所以当子类和父类之间存在有逻辑上的层次结构时,推荐使用抽象类;而接口多用于不同类之间,定义不同类之间的通信规则,所以当希望支持差别较大的两个或者更多对象之间的特定交互行为时,应该使用接口。 此外,接口可以继承接口,抽象类可以实现接口,抽象类也可以继承具体类。抽象类也可以有静态的main方法。

扩展:
抽象工厂(Abstract Factory)模式。抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时使用的一种工厂模式,抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则(即Liskov替换原则),任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换句话说,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

posted on 2022-04-28 08:00  Arya32f  阅读(355)  评论(0编辑  收藏  举报

导航