具有抽象函数的类,称之为叫抽象类!
抽象函数
当我们将多个事物的共同行为(函数)进行抽取并封装到另外一个类(父类)中时,发现在父类中,这些方法的具体执行内容无法确定,只能由这些子类来决定该函数的具体执行。那么在父类中,仅保留这些抽取来的函数的函数声明,不保留函数体即可。上述的函数就是抽象函数,用abstract关键字来修饰。
public class Sample {
public static void main(String[] args) {
Dog d = new Dog();
d.jiao();
d.eat();
Cat c = new Cat();
c.jiao();
c.eat();
Animal a = new Animal();
a.jiao(); a.eat();
}
}
abstract class Animal {
abstract void jiao();
abstract void eat();
}
class Dog extends Animal{
@Override
void jiao() {
System.out.println("汪汪汪~");
}
@Override
void eat() {
System.out.println("狗吃粮");
}
}
class Cat extends Animal{
@Override
void jiao() {
System.out.println("喵喵喵~");
}
@Override
void eat() {
System.out.println("猫吃鱼~");
}
}
class Pig extends Animal {
void gongbaicai(){
System.out.println("猪拱白菜~");
}
}
上述代码中的Pig虽是Animal的子类,但是并未重写/覆盖/实现 Animal中的抽象函数,所以编译报错! 要解决这个问题的只有两种方法:
抽象类
具有抽象函数的类也被称之为抽象类,也必须用abstract修饰。抽象类不能创建对象,只有其实现子类能够创建对象。
抽象类的特点
- 抽象类和抽象函数都需要被abstract修饰,抽象方法一定在抽象类中
- 抽象类不能创建对象,因为如果一旦创建对象,在调用其函数时,函数没有具体执行内容
- 只有覆盖了抽象类中所有的抽象函数后,子类才可以实例化。否则,该子类还是一个抽象类
抽象类和一般类的异同点
相同点:
- 它们都是用来描述事物的
- 它们之中都可以定义属性和行为
不同点:
- 一般类可以具体的描述是,抽象类描述事物时会有一些不具体的信息
- 抽象类比一般类可以多定义一个成员:抽象函数
- 一般类可以创建对象,而抽象类不能创建对象
关于抽象类的几个细节问题
抽象类一定是一个父类吗? 答:是的,因为抽象类本身就是有多个事物进行抽取而来的
抽象类是否有成员变量、成员函数、构造函数呢? 答:有,抽象类与一般类唯一的区别就是抽象类中抽象函数,其他一律相同(抽象类不能创建对象)!
抽象类中是否可以不定义抽象函数? 答:可以的。有抽象函数的类一定是抽象类,抽象类不一定有抽象函数!
抽象关键字abstract不能与哪些其他的关键字共存? 答:
- final:final修饰类时表示该类不能被继承,修饰函数时表示函数不能被重写;而抽象类本就是父类,并且其中的抽象函数就需要被子类重写。
- private:private修饰函数表示函数被私有,不能被子类继承;而抽象类中的抽象函数本就是需要被重写才能赋予功能。
- static:static修饰的函数是属于类的,随着类的加载被加载方法区中,和对象没有关系了,可以直接用类来调用静态成员。而抽象函数若被静态修饰,再被类调用就毫无意义。
|