抽象类的概念
什么是抽象
- 抽象类(Abstract Class): 在面向对象编程中,抽象类是一个不能被实例化的类,它通常包含抽象方法。抽象方法是没有实现的方法,它只声明了方法的签名,具体的实现留给子类去完成。
这里有一个规则:既然父类里面的方法是抽象的,那么对于整个类来说,它就有一个没有实现的方法,这个方法不知道怎么去实现,那么这个类是就是残缺不全的,因此这个类应该被定义为一个抽象类。
Java语言规定,当一个类里面有抽象方法的时候,这个类必须被声明为抽象类。
/**
* 父类Animal
* 在class的前面加上abstract,即声明成这样:abstract class Animal
* 这样Animal类就成了一个抽象类了
*/
abstract class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
/**
* 抽象方法
* 这里只有方法的定义,没有方法的实现。
*/
public abstract void enjoy();
}
/**
* 这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),
* 但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,
* 那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。
* @author gacl
*
*/
abstract class Cat extends Animal {
/**
* Cat添加自己独有的属性
*/
public String eyeColor;
public Cat(String n, String c) {
super(n);//调用父类Animal的构造方法
this.eyeColor = c;
}
}
/**
* 子类BlueCat继承抽象类Cat,并且实现了从父类Cat继承下来的抽象方法enjoy
* @author gacl
*
*/
class BlueCat extends Cat {
public BlueCat(String n, String c) {
super(n, c);
}
/**
* 实现了抽象方法enjoy
*/
@Override
public void enjoy() {
System.out.println("蓝猫叫...");
}
}
/**
* 子类Dog继承抽象类Animal,并且实现了抽象方法enjoy
* @author gacl
*
*/
class Dog extends Animal {
/**
* Dog类添加自己特有的属性
*/
public String furColor;
public Dog(String n, String c) {
super(n);//调用父类Animal的构造方法
this.furColor = c;
}
@Override
public void enjoy() {
System.out.println("狗叫....");
}
}
public class TestAbstract {
public static void main(String[] args) {
/**
* 把Cat类声明成一个抽象类以后,就不能再对Cat类进行实例化了,
* 因为抽象类是残缺不全的,缺胳膊少腿的,因此抽象类不能被实例化。
*/
//Cat c = new Cat("Catname","blue");
Dog d = new Dog("dogname","black");
d.enjoy();//调用自己实现了的enjoy方法
BlueCat c = new BlueCat("BlueCatname","blue");
c.enjoy();//调用自己实现了的enjoy方法
}
}
为什么要抽象? (提高代码复用性。灵活性)
-
简化复杂性:
- 抽象允许开发者专注于高层次的概念,而不是被复杂的细节所困扰。这有助于理解和处理复杂的系统。
-
提高可读性:
- 通过抽象,代码更加简洁和清晰,其他开发者可以更容易地理解代码的意图和功能。
-
增强可维护性:
- 抽象使得代码更容易维护,因为改变底层实现不会影响使用该实现的高层代码。
-
促进代码重用:
- 抽象使得开发者可以创建可重用的组件,这些组件可以在不同的项目和上下文中使用。
-
支持扩展性:
- 抽象使得在不修改现有代码的情况下扩展系统成为可能。例如,通过继承和多态性,可以添加新的行为而不影响现有系统。
-
实现多态性:
- 抽象是实现多态性的基础,允许以统一的方式处理不同类型的对象。
-
分离关注点:
- 抽象帮助分离系统的不同方面,使得开发者可以独立地工作在系统的不同部分,而不必担心其他部分的实现细节。
-
促进模块化:
- 抽象支持模块化设计,每个模块可以独立开发和测试,然后组合在一起形成完整的系统。
-
提高安全性:
- 通过封装实现的抽象,可以隐藏内部实现细节,只暴露必要的接口,从而提高系统的安全性。
-
支持设计模式的应用:
- 抽象是设计模式的基础,设计模式提供了解决常见设计问题的模板,它们利用抽象来简化设计过程。
-
适应变化:
- 在软件开发过程中,需求经常变化。抽象使得系统更容易适应这些变化,因为高层设计可以保持稳定,而底层实现可以灵活调整。