8. abstract抽象类
动物到底是什么样的?根本没法实例化出来!所以要使用抽象类。
当描述一个类的时候,如果不能确定功能函数如何定义,那么该类就可以定义为抽象类,功能函数应该描述为抽象函数。
一开始,我们先把上一节的Animal类给变成抽象的:
abstract class Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void eat();
public abstract void sleep();
public abstract void say();
}
抽象类的特点
1:有抽象方法的类,该类一定是抽象类。
2:抽象类中不一定要有抽象方法。
这段代码就不报错。。。
abstract class Animal {
public void eat() {
System.out.println("米西米西,花布拉吉。。。");
}
}
3:抽象类不能使用new创建对象(先这样理解,但实际不是这样)
创建对象,使用对象的功能,抽象类的方法,没有方法体。
4:抽象类主要为了提高代码的复用性,让子类继承来使用。
5:编译器强制子类实现抽象类父类的未实现的方法。
当然也可以不实现,前提是子类的也要声明为抽象的。
抽象的优点
1:提高代码复用性
2:强制子类实现父类中没有实现的功能
3:提高代码的扩展性,便于后期的代码维护
- 抽象类不能创建对象,那么抽象类中是否有构造函数?
- 抽象类中一定有构造函数。主要为了初始化抽象类中的属性。通常由子类实现或重写。
- 抽象类可以没有抽象方法(java.awt.*的类就是这样子操作的)。
- 抽象类可以继承普通类与抽象类。
- 抽象类不能直接使用类名创建实例,但是有构造方法,构造方法是让子类进行初始化。
注意一点:final和abstract一定不能同时修饰同一个类。
最后,我们把上一节的图形类也抽象出来吧!
abstract class Graph {
public abstract double getPerimeter();
public abstract double getArea();
}
class Circle extends Graph {
private double r;
public double getPerimeter() {
return Math.PI * 2 * r;
}
public double getArea() {
return Math.PI * r * r;
}
}
class Rectangle extends Graph {
private double width, height;
public double getPerimeter() {
return 2 * (width + height);
}
public double getArea() {
return width * height;
}
}