JavaSE基础:抽象类

定义

在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

abstract void fun();
复制代码

抽象方法必须用abstract关键字进行修饰。

如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

问题说明: 在《JAVA编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?所以暂且记住这个概念吧,不必去深究为什么。

[public] abstract class ClassName {
    abstract void fun();
}
复制代码

从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

为什么需要抽象类?如何定义抽象类

  • 是一种模版模式抽象类为多有子类听了一个通用的模版,子类可以在这个模版基础上进行扩展
  • 通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。

抽象类的使用规则

  • 有抽象方法的类只能定义为抽象类
  • 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法)。
  • 抽象类不能实例化以及不能new来实例化抽象方法
  • 抽象类可以包含属性/方法/构造方法,但是构造方法不能用来new实现类,只能用来被子类调用
  • 不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。
  • 抽象类只能用来被继承
  • 抽象方法必须被子类实现,否则子类也必然是抽象类

代码示例

package com.shxt.abstract_class;

public abstract class Animal {
    public abstract void run();

    public void breath(){
        System.out.println("呼吸");
        run();//调用
    }

    public Animal(){
        System.out.println("创造一个动物");
    }
}

class Cat extends  Animal{
    @Override
    public void run() {
        System.out.println("猫步轻跑");
    }
}
//抽象方法必须被子类实现,否则子类也必然是抽象类
abstract class Dog extends  Animal{

}
复制代码

我的理解:抽象方法的意义在于,将方法的设计和方法的实现分离了!

你可能感兴趣的:(java)