抽象类
- 引言
- 抽象类 抽象方法
引言
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
抽象类 抽象方法
继承的本质是代码的复用,子类可以对父类方法进行重写,当我们子类很多,并且都需要在子类中重写同一个方法,我们其实就不需要在父类中实现这个方法。
但是这样父类看起来好像就没有必要定义,此时我们可以创建抽象类
-
定义:abstract修饰的类叫做抽象类,abstract修饰的方法叫做**抽象方法**
总体来说就是:
- 抽象类:包含抽象方法的类
- 抽象方法:没有方法主体的方法
-
使用格式
abstract class 类名{ 修饰符 abstract 返回值类型 方法名(参数列表); }
-
特点:
-
abstract修饰的抽象方法不需要再抽象类中实现,但是必须在子类中重写并实现(子类如果不是抽象类)否则就会报错,如图:
-
抽象类一定是父类
-
只有抽象类中才能有抽象方法,普通类中不可以有抽象方法
-
抽象类中不一定写抽象方法,也可以写普通方法
-
抽象类无法被实例化(被new对象),只能使用多态
-
final和abstract不可以同时使用
-
abstract修饰的方法不可以被static关键字修饰,因为static修饰的方法属于类方法,abstract修饰的方法属于对象
-
抽象方法不可以使用private访问修饰符进行修饰
-
抽象类中有构造器,但是抽象类的构造器无法创建对象,其构造器的目的是为了完成必要的初始化操作
-
举个例子
// 抽象类(父类)
public abstract class Animals {
private String name;
public Animals(String name){ // 此构造器只能用于初始化值
this.name = name;
}
public String getName() {
return name;
}
public abstract void run();// 抽象方法不可以被实现,会报错
// {System.out.println("动物都会跑");}// 不需要再实现方法
public void fly(){
System.out.println("会飞");
}
}
// 子类
public class Pig extends Animals{
public Pig(String name){
super(name);
}
@Override
public void run() {
System.out.println("猪会跑");
}
}
// 子类
public class Cat extends Animals{
public Cat(String name){
super(name);
}
@Override
public void run() {
System.out.println("猫会跑");
}
}
// 测试类
public class Test {
public static void main(String[] args) {
Animals animals = new Animals() // 报错 无法实例化
Animals a = new Pig("小猪");
Animals b = new Cat("小猫");
a.run();
System.out.println(a.getName());
}
}