标签:解决 面向 抽象类 one 概述 png 方式 bst 存在
下面介绍一个场景:
一个动物类可以分为哺乳动物和非哺乳动物,而同时哺乳动物和非哺乳动物都可以繁殖后代,还有哺乳和非哺乳动物的保温方式等,而这些都是哺乳动物和非哺乳动物所共有的特征,但是,它们特点却又不一样,如哺乳动物通过胎生繁殖和恒温动物,而非哺乳动物则是卵生和冷血动物。
如果要将上面的问题已面向对象的思想解决:则首先可以抽象成三个实体类为Animal类,Mammal类和一个NonMammal类。Animal作为Mammal和NonMammal的父类。
那么问题来了,对于子类都具有的行为,但是这些行为对于不同的体系又有不同的区别,那么对于这类情况应该怎么进行处理?
对于这种情况java就提供了一种方案来解决这个问题,这个方案就是抽象类。
一、抽象类的概述
那么Java提供的抽象类是如何解决上面的问题的呢?下面一步步的分析,对于那些子类全部都共有且特点一模一样的特性,那么就可以直接写在父类中,而不需要在每个子类重写一模一样功能的方法,因为子类只要继承父类就可以得到该特性;但是对于那些,子类都有的特性且这些特性又各有特点的时候,我们就可以在父类定义一个方法而不去具体实现,子类通过继承父类的这个方法去完善这个特性的自身特点。而这个在在父类定义一个方法而不去具体的实现,那么这个方法就叫做抽象方法。
那么对于上面场景的用抽象类解决的办法为:在Animal类中将繁殖和温度类型的两个方法抽象实现(因为这两个方法对于哺乳和非哺乳都必有,但特征又不同),而对于其他的一些方法,如睡觉和进食则是他们都共有且特点又一样的就定义为非抽象方法。因为对于这类方法,子类只需要继承父类的就可以了。见下代码示例:
Animal类: public abstract class Animal { // 繁殖的抽象方法,胎生或卵生 abstract public void breed(); // 温度的抽象方法(恒温或冷血) abstract public void temperatureType(); // 其他共用的且没有区别的特性,只需要继承就可以实现的功能 public void eat() { System.out.println("不管哺乳动物还是非哺乳动物都要进食"); } public void sleep() { System.out.println("不管哺乳动物还是非哺乳动物都要休息"); } } Mammal类: public class Mammal extends Animal{ @Override public void breed() { System.out.println("哺乳动物通过胎生繁殖"); } @Override public void temperatureType() { System.out.println("哺乳动物为恒温动物"); } } NonMammal类: public class NonMammal extends Animal { // 对于继承了抽象类的具体了,必须要实现抽象类的抽象方法。 // 也就是对抽象类中的抽象方法进行重写 // 对于抽象类的非抽象方法也可以重写也可以不重写 @Override public void breed() { System.out.println("非哺乳动物通过卵生繁殖"); } @Override public void temperatureType() { System.out.println("非哺乳动物为冷血动物"); } } AbstractDemo类: public class AbstractDemo { public static void main(String[] args) { // 抽象类不能实例化 // Animal animal = new Animal(); System.out.println("哺乳动物"); Animal animal1 = new Mammal();//多态 animal1.breed(); animal1.temperatureType(); animal1.sleep(); animal1.eat(); System.out.println("\n\n非哺乳动物"); Animal animal2 = new NonMammal(); animal2.breed(); animal2.temperatureType(); animal2.sleep(); animal2.eat(); } }
运行截图:
抽象类的特点:
public abstract class Animal { public String string = ""; // 抽象类的构造方法 public Animal(String string){ this.string = string; System.out.println(string); } public Animal(){} ...... } public NonMammal(String string) { super(string); }
public abstract class BridAnimal extends Animal { // 可以不实现Animal的抽象方法 }
这是因为抽象方法必须在子类要重写的,也就是抽象方法必须对外可见,而private修饰的话对外不可见,子类就不能继承,也就不能重写,两者冲突。
同样抽象方法必须要进行重写,而final修饰的方法是不能重写的,这两者存在矛盾,因此不能组合。
static修饰的方法是可以进行类名调用的,如果将一个抽象方法声明为static,而此抽象方法没有实现,那么这种调用是毫无意义的。因此也不能组合。
标签:解决 面向 抽象类 one 概述 png 方式 bst 存在
原文地址:http://www.cnblogs.com/geore/p/7157739.html