标签:解决 面向 抽象类 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