抽象类
- 引言
- 抽象类 抽象方法
引言
 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
 在 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());
    }
}



















