这篇文章从不同角度归纳介绍了抽象类的知识点及其注意事项。文中引用的具体例子在这里:抽象类的一个例子
- Triangle类是继承自抽象类GeometriObject的具体子类
- GeometriObject中包含两个抽象方法:getPerimeter,getArea/
- Triangle中实现了这两个方法
好了,进入正题。
目录
一,抽象类关键点
抽象类不可以用于创建对象。 抽象类可以包含抽象方法, 这些方法将在具体的子类中实现。
二,抽象类与抽象方法的定义
1.抽象类
-
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
-
抽象类设计得非常抽象, 以至于它都没有任何具体的实例。
-
在类头使用 abstract修饰符表示该类为抽象类
例如:abstract class GeometricObject
2.抽象方法
GeometricObject就成为一个抽象类。
- 抽象方法指一些只有方法声明,而没有具体方法体的方法。
- 在方法头中使用 abstract 修饰符表示
例如:public abstract double getPerimeter();
在UML图形记号中,抽象类和抽象方法的名字用斜体表示.
三,注意事项
1.关于抽象类的构造函数的问题
- 抽象类的构造方法定义为 Protected, 因为它只被子类使用。
- 创建一个具体子类的实例时,它的父类的构造方法被调用以初始化父类中定义的数据域。
2.抽象类与常规类的区别
- 抽象类和常规类很像,但是不能使用new 操作符创建它的实例。
- 抽象类也不能使用 new 操作符来初始化的。 但是,仍然可以定义它的构造方法, 这个构造方法在它的子类的构造方法中调用。
例如, CeometricObject 类的构造方法在 Triangle 类中调用:
public Triangle(String color, boolean filled, double side1, double side2, double side3) {
super(color, filled);
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
- 不能使用 new 操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。
例如, 下面的语句创建一个元素是 CeometricObject 类型的数组是正确的:
GeometricObject[] objects = new CeometricObject[10];
然后可以创建一个 CeometricObject 的实例, 并将它的引用赋值给数组,如下所示:
Objects[0] = new Triangle();
3.抽象方法的定义和实现问题
- 抽象方法在抽象类中只有定义而没有实现。 它的实现由子类提供。
例如:抽象类CeometricObject 中两个抽象方法:
//两个抽象方法
public abstract double getArea();
public abstract double getPerimeter();
- 抽象类拓展的非抽象子类必须将此抽象类的所有抽象方法重写
例如:CeometricObject 的子类Triangle类
//一定要重写实现抽象父类中的抽象方法
@Override
public double getArea() {
double s = (side1 + side2 + side3)/2;
return Math.sqrt(s*(s-side1)*(s-side2)*(s-side3));
}
@Override
public double getPerimeter() {
return side1+side2+side3;
}
-
如果抽象父类的子类不能实现所有的抽象方法, 那么子类也必须定义为抽象类。也就是子类可以覆盖父类的方法并仍将它定义为 abstract
-
抽象方法不能定义在非抽象类中。
-
还要注意到,抽象方法是非静态的
4.抽象方法和抽象类之间的关系
- 只要包含抽象方法,该类必须声明为抽象类。
- 但是抽象类可以不包含抽象方法
5.抽象类父类和子类的关系
- 父类是抽象类
- 子类是非抽象类,那么子类必须重写实现父类中的所有抽象方法
- 子类也是抽象类,子类不必实现父类中的所有抽象方法
- 子类是抽象类。父类既可以是抽象的也可以是具体的。
例如, Object 类是具体的, 但是它的子类如 CeometricObject 可以是抽象的
友情链接——纯干货
Java面向对象,这些你一定想再来复习复习: