什么是抽象类?当然是比类还抽象的类了=。=
本文基于Mars老师的Java4Android视频。
抽象函数
只有函数的定义,而没有函数体的函数。
//没有花括号 { }
abstract void fun() ;
抽象类
抽象类的语法特征:
- 抽象类不能够生成对象。
为什么呢?如果能生成对象,就可以通过对象调用抽象方法,然而抽象方法并没有方法体,就会出错。 - 如果一个类当中包含抽象函数,那这个类必须被声明为抽象类。
- 如果一个类当中没有抽象函数,也可以声明为抽象类。
当有的类,我们不想让别人生成它的对象,就可以把它定义为抽象类。这种类,也称为基类,专门用来继承。 - 抽象类可以有构造函数吗?
(抽象类不能生成对象,构造函数用于生成类对象,那抽象类应该没有构造函数吧?)错了,抽象类是可以有构造函数的。在子类中,如果有构造函数(因为子类可以不是抽象类),那么系统在调用子类的这个构造函数时,会自动地加一行super();
,即调用父类的构造函数。
抽象类的作用
不能生成对象,要抽象类做什么呢?
- 抽象类,天生就是用来当爹的,也就是用来被继承的。因为它的子类,可以通过重写抽象函数,从而可以生成对象。
举个例子
建一个抽象类,包含一个抽象函数eat()
abstract class Person {
//抽象类可以有构造函数
Person() {
System.out.println("Person`s constructor");
}
String name;
int age;
void introduce() {
System.out.println("My name is " + name + ",I`m "+ age + " years old");
}
abstract void eat();
}
Chinese作为Person的子类。如果不重写eat,类名前就必须加上abstract。当然这样做,继承就没什么意义了,因此我们重写eat方法。
class Chinese extends Person {
Chinese() {
//系统执行了super();
System.out.println("Chinese`s constructor");
}
void eat() {
System.out.println("Chinese food saikou~~~~");
}
}
这里不能生成Person对象,因为它是抽象类。
class Test {
public static void main(String args []) {
//向上转型
Person p = new Chinese();
p.name = "sia";
p.age = 22;
p.introduce();
p.eat();
}
}
结果: