面向对象——抽象类
文章目录
- 抽象类
- 抽象类的特点:
- 抽象类和一般类的区别:
- 抽象类的注意事项:
抽象类
抽象类不是一个完整的类,它一般被用作于基类(基础类)。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
语法:
public abstract class 类名{
}
-
抽象方法:只有方法的定义,没有方法体的实现,这种方法就是抽象方法
-
抽象类: 一个类中如果有抽象方法,那么这个类就是抽象类
具体的执行过程是由子类来决定的
由于抽象类不是具体的,所以不能创建对象
// 先定义抽象类,里面有一个抽象方法
public abstract class Area{
// 定义抽象方法
abstract void area();
}
// A类继承抽象类
public class A extends Area{
@Override
void area() {
System.out.println("我是A");
}
}
// B类继承抽象类
public class B extends Area{
@Override
void area() {
System.out.println("我是B");
}
}
// 写一个main方法跑一下程序
public class Main {
public static void main(String[] args) {
A a = new A();
a.area();
B b = new B();
b .area();
}
}
抽象类的特点:
(1)抽象类和抽象函数都需要被abstract关键字修饰,抽象函数一定在抽象类中
(2)抽象类不能创建对象
(3)子类只有重写了父类所有的抽象函数之后,才能创建对象,否则本身也是一个抽象类
抽象类和一般类的区别:
- 抽象类
含有抽象方法的类就叫抽象类。而抽象方法就是被abstract修饰的方法,这个方法可以没有具体的实现。
在抽象类的子类中必须对抽象方法进行重写,当其子类为抽象类时,可以不重写抽象方法,但在其子类中一旦有普通类,则必须重写父类继承的所有抽象方法。
抽象类不可以实例化。抽象类的构造方法作用为初始化子类对象。
抽象类存在的意义就是为了被继承。
抽象类中的普通属性和普通方法都需要用子类的对象去调用。 - 普通类
普通类可以实例化,实例化后可以调用自己类中的属性和方法或父类的方法和属性。
普通类的构造方法中必须要调用父类的构造方法
如果普通类继承了抽象类,那么必须要重写所有父类的抽象方法
普通类存在的意义就是实例化。 - 普通类和抽象类的区别总结
1、抽象类的存在时为了被继承,不能实例化,而普通类存在是为了实例化一个对象
2、抽象类的子类必须重写抽象类中的抽象方法,而普通类可以选择重写父类的方法,也可以直接调用父类的方法
3、抽象类必须用abstract来修饰,普通类则不用
4、普通类和抽象类都可以含有普通成员属性和普通方法
5、普通类和抽象类都可以继承别的类或者被别的类继承
6、普通类和抽象类的属性和方法都可以通过子类对象来调用
abstract是抽象类的关键字,也是抽象方法声明上必须加的修饰符,在定义方法上它一般不能与以下几个关键字共存:
1、和static:
abstract class A {
public abtract static void method();
}
static修饰后可以直接类名调用方法,但是抽象方法没有实现体,调用无意义;
2、和final:
final修饰的类不能被继承,修饰的方法不能被重写,修饰的成员变量只能为常量;但是继承的子类要重写这个抽象方法,所以会出现矛盾;
3、和private:
抽象方法是为了让子类重写并给定实现体, 但是private修饰的方法只能本类访问,所以矛盾。
抽象类的注意事项:
抽象类不能进行实例化(对象创建)。(未来可以通过匿名类来创建它的对象)
1.语义上。自然界不存在这具体的东西,没有哪个水果可以代替”水果”这个名词,没有哪个宠物可以代替”宠物”这个名词,所以它只能是作为一个分类名词用,创建动物/宠物的实例。
2.语法上。如果可以实例化,其包含的抽象方法,在运行程序时,JVM无法执行该方法,因为方法没有方法体。
3.一般作为基类也不需要进行使用。
抽象类可以作为多态使用。例如:Motor motor = new Car();
抽象类中可以有抽象方法,也可以没有抽象方法。但是有抽象方法的类一定是抽象类。
抽象类为父类时,子类必须要重写父类中的所有抽象方法,否则其也需要定义为抽象类。(父债子偿)