【背景】
在设计模式学习的时候,就了解过抽象类和接口,过了好长一段时间,基本上忘得差不多了,现在来回顾一下。
【正文】
【为什么会有抽象类?】
在生活中,我们常常会遇到一种情景:每个人都要吃饭,中国人要吃饭,美国人要吃饭,但是中国人和美国人吃饭时用的工具是不一样的,也就是说中国人和美国人在吃饭这个问题上是不同的,中国人用筷子吃饭,美国人则用刀叉吃饭,当中国人和美国人都要吃饭这种事情在代码中体现时,就会发现一样是吃饭,但是吃饭的实现方式不一样,我们可以把中国人和美国人当成两个类,而各自吃饭的方法需要用不同的方法体来定义,后来又会有俄罗斯人要吃饭,英国人要吃饭,日本人也要吃饭,每个国家的人吃饭方式都不一样,那所有的吃饭方法都要在每个类中写一遍,一样的方法,不同的方法体,方法会在每个类中不断地重复,有些时候可能会忘了吃饭,比如日本人,那么问题来了——如何让代码简化?怎么防止类中方法的遗漏?一样的东西我不想重复写了……
这时候抽象类就来了,我可以把中国人、美国人、英国人、俄罗斯人、日本人共同的方法或行为抽象到一个类中,在这个类中有所有具体类一样的方法,但是没有具体的实现,由中国人、美国人等等抽象出来的人类就是所谓的抽象类,都要吃饭、都有姓名、都有性别、都有国籍等等这一系列的方法或属性就可以用抽象类来表达,而具体的中国人继承自抽象类-人类,自动获得抽象类的抽象方法,就不会出现遗漏、代码也做到了重复利用。
【什么是抽象类?】
有时,需要想创建一个超类,该超类只定义一个为所有子类共享的一般形式,至于细节则交给每一个子类去填充。这样的类决定了方法的本质,即子类必须主笔性。这时的超类很抽象以至于它没哟任何具体的实例,这样的类称为抽象类。
【抽象类的例子实战-java版】
public abstract class Shape{ //定义抽象类-形状类
protected double length; //长
protected double width; //宽
public Shape(double length,double width){
this.length=length;
this.width =width;
}
public abstract double area(); //定义抽象方法-计算面积
}
public class Triangle extends Shape{ //三角形
Triangle(double num,double num1){
super(num,num1);
}
public double area(){//三角形面积-此处实现抽象类的抽象方法
return length * width/2;
}
}
public class Rectangle extends Shape{ //矩形
Rectangle(double num,double num1){
super(num,num1);
}
public double area(){//矩形面积-此处实现抽象类的抽象方法
return length*width;
}
}
public class TestArea{
public static void main(string[] args){
Triangle tr = new Triangle(3,5);
Rectangle re = new Recatngle(4,6);
system.out.println(“三角形的面积”+tr.area());
system.out.println("矩形的面积"+re.area());
}
}
【类图表示】
注 :抽象类的类名在类图中要用斜体表示,以区别普通的类。
【使用场景】
如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。
如果知道所有类都会共享一个公共的行为实现,就可以使用抽象类,并在其中实现该行为。
规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能
【说明】
- 抽象类可以包含非抽象的方法。
- 若类中包含了抽象方法,则该类必须要定义为抽象类。抽象方法只需声明,而不需实现。
- 抽象类不能用来实例化对象。一般用于继承。
- 抽象类必须用abstract 关键字来修饰;抽象方法必须用abstract类修饰。
- 一个从抽象类扩展而来的子类必须覆盖所有超类的抽象方法后才能被实例化,否则这个子类还是一个抽象类。
- 构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法。
【一句话总结】
抽象类,"is a"关系,抽象出共同的本质特征,单一继承
【小编叨叨两句】
实践出真知,踏实走好每一步,查阅资料的时候接触了一些底层的知识,从设计层面、使用上来理解,更为深入和透彻,拜读了各位大神的著作,小编得知,功夫我还差的远,还需多练。请路过的朋友们多多指点,顺便点个赞!