欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

抽象类

程序员文章站 2022-05-23 19:42:06
...

抽象类的定义与使用
抽象类只是在普通类的基础上扩充了一些抽象方法而已,所谓的抽象方法是指只声明而未实现的方法,即没有方法体。所有的抽象方法要求使用abstract关键字来定义,并且抽象方法所在的类也一定要使用abstract关键字来定义,表示抽象类。看代码,定义一个抽象类:

abstract class Person{//类加abstract
 	private String name;
 //普通方法
	 public Sting getName(){
		  return this.name;
	 }
	 public void setName(String name){
		  this.name = name;
	 }
 //抽象方法,没有方法体
	 public abstract void getPersonInfo();
}

易知,抽象类就是比普通类多了一些抽象方法而已。抽象类中包含抽象方法,而抽象方法不包含方法体,即没有具体的实现。因此抽象类不能直接实例化对象,这也就要求:
(1)所有的抽象类必须有子类;
(2)抽象类的子类(不是抽象类)必须覆写抽象类的所有抽象方法;
(3)抽象类的对象可以通过对象多态性利用子类为其实例化;
(4)privateabstract不能同时使用。
注意
(1)抽象类一定不能用final声明,原因很简单,final是终结器,使用final修饰就不允许有子类,但是抽象类又必须有子类,否则无法实例化;相应的,抽象类也不允许使用private定义,因为抽象类必须要能被覆写;
(2)抽象类分内部抽象类和外部抽象类,内部抽象类可以使用static定义描述外部抽象类,但外部抽象类不允许出现该关键字。
模板设计模式
开闭原则(OCP)
一个软件实体如类、模板和函数应该对扩展开放,而对修改关闭。开闭原则是java中最基础的设计原则。
模板方法
模板方法定义了一个算法的步骤,并允许子类为一个或者多个步骤提供具体实现。相比一般方法,模板方法有什么优势呢?
(1)首先,模板方法由超类(父类)主导一切,拥有算法,并且保护算法,由超类的存在,可以将代码复用最大化;
(2)其次,算法只存在于一个地方,如果出现任何的问题,是比较容易修改的,且其弹性高,新加入的方法只需要实现其不一样的地方就可以;
(3)最后超类专注于算法本身,而由子类提供完整的实现。
模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
接口的定义与使用
为什么要有接口?抽象类与普通类相比最大的特点就是约定了子类的实现要求,但是抽象类存在单继承的局限,如果要约定子类的实现要求并且避免单继承局限就需要使用接口。而且在以后的开发中,接口优先。
接口定义
接口就是抽象方法和全局常量的集合,在java中接口使用interface关键字定义。如:

interface IMessage{
	 //全局常量
	 public static final String MSG = "I am a biter";
 	//抽象方法
	 public abstract void print();
}

为了区分接口,一般在所有接口前面追加字母I。子类要想实现接口,就必须使用implements关键字来实现接口,同时,一个子类可以实现多个接口(所以使用接口可以实现多继承的概念),对于接口的子类必须覆写接口中的全部抽象方法,随后可以利用子类的向上转型通过实例化子类来得到接口的实例化对象。
接口使用限制
(1)接口中只允许public权限,无论是属性还是方法;
(2)当一个子类既需要实现接口又需要继承抽象类时,得先使用extends继承一个抽象类,然后使用implements实现多个接口;
(3)一个抽象类可以使用implements实现多个接口,但是接口不能继承抽象类;
(4)一个接口可以使用extends继承多个父接口;
(5)接口可以定义一系列的内部结构,包括:内部普通类、内部接口;其中,使用static定义的内部接口相当于一个外部接口。
接口的应用
接口在实际开发中有三大核心应用环境:定义操作标准;表示能力;在分布式开发中暴露远程服务方法。
工厂设计模式
(1)简单工厂模式:专门定义一个类用来创建其他类的实例,被创建的实例通常都具有共同的父类。
----其优点就是:简单易于实现,把类的实例化交给工厂,易于解耦;
----缺点是:添加具体产品需要修改工厂,违反了OCP开放封闭原则;
(2)工厂方法模式:定义一个用来创建对象的接口,让子类决定实例化哪一个类,让子类决定实例化延迟到子类。
----其优点是:降低了代码耦合度,对象的生成交给子类去完成;实现了开闭原则,每次增加子产品,不需要修改原有代码;
----缺点是:增加了代码量,每个产品都要有自己的一个具体工厂;当增加抽象产品时,也就是其他产品族,需要修改工厂,违反开闭原则。
(3)抽象工厂模式:提供一个创建一系列相关产品或相互依赖对象的接口,而无需指定他们具体的类。
----其优点是:代码解耦;实现多个产品族;满足开放封闭原则;可以定义实现不止一个接口,一个工厂亦可以生产不止一个产品类,对于复杂对象的生产相当灵活;
----缺点是:扩展产品族相当麻烦,也会违反OCP,需要修改所有的工厂;由于抽象工厂模式是工厂方法模式的扩展,总体来说,很笨重。
代理设计模式
两个子类共同实现一个接口,其中一个子类负责真是业务实现,另一个子类完成辅助真实业务主题的操作。其本质就是:所有的真实业务操作都会有一个与之辅助的工具类(功能类)共同完成。
抽象类与接口的区别(非常重要)
(1)抽象类的结构组成是:普通类+抽象方法;有各种权限;子类使用extends
关键字继承抽象类;一个抽象类可以实现若干个接口;一个子类只能继承一个抽象类;
(2)接口的结构组成是:全局常量+抽象方法;权限是public;使用implements关键字实现接口;接口不能继承抽象类,但是可以使用extends关键字继承多个父接口;一个子类可以实现多个接口。