类到对象是实例化,对象到类是抽象 抽象类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类,类本身是不存在的,所以抽象类无法创建对象 抽象类也属于引用数据类 抽象类定义的语法:[修饰符列表] abstract class 类名 {类体;} 抽象类是无法实例化的,无法创建对象,所以抽象类是用来被子类继承 抽象类的子类可以是抽象类,也可以是非抽象类 子类继承抽象类,子类可以实例化对象 抽象类虽然无法实例化,但是抽象类有构造方法,是供子类使用的 抽象类关联到一个概念:抽象方法,抽象方法表示没有实现的方法,没有方法体的方法public abstract void do(); 抽象方法特点:没有方法体,以分号结尾;前面修饰符列表中有abstract关键字 抽象类中不一定有抽象方法,但是抽象方法一定出现在抽象类中
// 抽象类
abstract class Animal {
    // 抽象方法
    public abstract void move();
}

//Dog类(非抽象类)继承抽象类
class Dog extends Animal {

}

以上程序编译错误:抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中,Dog类继承抽象类Animal,抽象类Animal中存在抽象方法,Dog类属于子类,非抽象的,那么会将抽象方法继承过来,程序就会报错。在Dog类中,需要将从父类继承过来的抽象方法覆盖/重写,或者也可以叫做“实现”,把抽象的方法实现了:

// 抽象类
abstract class Animal {
    // 抽象方法
    public abstract void move();
}

//Dog类(非抽象类)继承抽象类
class Dog extends Animal {
    public void move() {
    }
}
重要结论:一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现。这是java语法上强制规定的,必须的,不然编译报错。这里的覆盖/重写,也可以叫做实现(对抽象的实现)
public class AbstractTest {
    public static void main(String[] args) {
        // 面向抽象编程
        // 父类型指向子类型对象
        Animal a = new Dog();
        a.move();
    }
}

// 抽象类
abstract class Animal {
    // 抽象方法
    public abstract void move();
}

//Dog类(非抽象类)继承抽象类
class Dog extends Animal {
    public void move() {
        System.out.println("狗在吃骨头");
    }
}

发表评论